From db06cd769cd79dc783ce44f66dd58360827c275b Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Mon, 10 Nov 2025 12:14:48 -0600 Subject: [PATCH 01/15] feat(askai): add Kapa.ai source group filtering for InfluxDB v3 - Add ai_source_group_ids field to all InfluxDB v3 products in data/products.yml - Add getProductSourceGroupIds() function to retrieve source group IDs from product data - Enables filtered AI responses using Kapa source groups for documentation pages - Follows existing pattern for dynamic product configuration - Implement version-specific config support (__v1, __v2 suffixes) - Append version hints to example questions for InfluxDB database products only - Make example questions generic (remove product-specific names) - Tools (Telegraf, Chronograf, Kapacitor, Flux, Explorer) display questions without version hints - Pre-fills chat input with [version: /path/] for InfluxDB database products - Users can easily edit or remove the pre-filled text - Works for manual opens (Cmd+K) and programmatic opens - Converts module to TypeScript --- assets/js/ask-ai.js | 108 --------------- assets/js/ask-ai.ts | 330 ++++++++++++++++++++++++++++++++++++++++++++ data/products.yml | 71 ++++++---- 3 files changed, 373 insertions(+), 136 deletions(-) delete mode 100644 assets/js/ask-ai.js create mode 100644 assets/js/ask-ai.ts diff --git a/assets/js/ask-ai.js b/assets/js/ask-ai.js deleted file mode 100644 index 120047029a..0000000000 --- a/assets/js/ask-ai.js +++ /dev/null @@ -1,108 +0,0 @@ -import { productData } from './page-context.js'; - -function setUser(userid, email) { - const NAMESPACE = 'kapaSettings'; - - // Set the user ID and email in the global settings namespace. - // The chat widget will use this on subsequent chats to personalize the user's experience. - window[NAMESPACE] = { - user: { - uniqueClientId: userid, - email: email, - }, - }; -} - -// Initialize the chat widget -function initializeChat({ onChatLoad, chatAttributes }) { - /* See https://docs.kapa.ai/integrations/website-widget/configuration for - * available configuration options. - * All values are strings. - */ - // If you make changes to data attributes here, you also need to - // port the changes to the api-docs/template.hbs API reference template. - const requiredAttributes = { - websiteId: 'a02bca75-1dd3-411e-95c0-79ee1139be4d', - projectName: 'InfluxDB', - projectColor: '#020a47', - projectLogo: '/img/influx-logo-cubo-white.png', - }; - - const optionalAttributes = { - modalDisclaimer: - 'This AI can access [documentation for InfluxDB, clients, and related tools](https://docs.influxdata.com). Information you submit is used in accordance with our [Privacy Policy](https://www.influxdata.com/legal/privacy-policy/).', - modalExampleQuestions: - 'Use Python to write data to InfluxDB 3,How do I query using SQL?,How do I use MQTT with Telegraf?', - buttonHide: 'true', - exampleQuestionButtonWidth: 'auto', - modalOpenOnCommandK: 'true', - modalExampleQuestionsColSpan: '8', - modalFullScreenOnMobile: 'true', - modalHeaderPadding: '.5rem', - modalInnerPositionRight: '0', - modalInnerPositionLeft: '', - modalLockScroll: 'false', - modalOverrideOpenClassAskAi: 'ask-ai-open', - modalSize: '640px', - modalWithOverlay: 'false', - modalYOffset: '10vh', - userAnalyticsFingerprintEnabled: 'true', - fontFamily: 'Proxima Nova, sans-serif', - modalHeaderBgColor: 'linear-gradient(90deg, #d30971 0%, #9b2aff 100%)', - modalHeaderBorderBottom: 'none', - modalTitleColor: '#fff', - modalTitleFontSize: '1.25rem', - }; - - const scriptUrl = 'https://widget.kapa.ai/kapa-widget.bundle.js'; - const script = document.createElement('script'); - script.async = true; - script.src = scriptUrl; - script.onload = function () { - onChatLoad(); - window.influxdatadocs.AskAI = AskAI; - }; - script.onerror = function () { - console.error('Error loading AI chat widget script'); - }; - - const dataset = { - ...requiredAttributes, - ...optionalAttributes, - ...chatAttributes, - }; - Object.keys(dataset).forEach((key) => { - // Assign dataset attributes from the object - script.dataset[key] = dataset[key]; - }); - - // Check for an existing script element to remove - const oldScript = document.querySelector(`script[src="${scriptUrl}"]`); - if (oldScript) { - oldScript.remove(); - } - document.head.appendChild(script); -} - -function getProductExampleQuestions() { - const questions = productData?.product?.ai_sample_questions; - return questions?.join(',') || ''; -} - -/** - * chatParams: specify custom (for example, page-specific) attribute values for the chat, pass the dataset key-values (collected in ...chatParams). See https://docs.kapa.ai/integrations/website-widget/configuration for available configuration options. - * onChatLoad: function to call when the chat widget has loaded - * userid: optional, a unique user ID for the user (not currently used for public docs) - */ -export default function AskAI({ userid, email, onChatLoad, ...chatParams }) { - const modalExampleQuestions = getProductExampleQuestions(); - const chatAttributes = { - ...(modalExampleQuestions && { modalExampleQuestions }), - ...chatParams, - }; - initializeChat({ onChatLoad, chatAttributes }); - - if (userid) { - setUser(userid, email); - } -} diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts new file mode 100644 index 0000000000..ef79470ee2 --- /dev/null +++ b/assets/js/ask-ai.ts @@ -0,0 +1,330 @@ +import { productData, version } from './page-context.js'; + +// Type definitions for Kapa.ai widget +declare global { + interface Window { + Kapa: KapaFunction; + influxdatadocs: { + AskAI: typeof AskAI; + }; + kapaSettings?: { + user: { + uniqueClientId: string; + email?: string; + }; + }; + } +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars +type KapaFunction = (command: string, options?: unknown) => void; + +interface ChatAttributes extends Record { + modalExampleQuestions?: string; + sourceGroupIdsInclude?: string; +} + +interface InitializeChatParams { + onChatLoad: () => void; + chatAttributes: ChatAttributes; +} + +interface AskAIParams { + userid?: string; + email?: string; + onChatLoad?: () => void; + [key: string]: unknown; +} + +function setUser(userid: string, email?: string): void { + const NAMESPACE = 'kapaSettings'; + + // Set the user ID and email in the global settings namespace. + // The chat widget will use this on subsequent chats to personalize + // the user's experience. + window[NAMESPACE] = { + user: { + uniqueClientId: userid, + ...(email && { email }), + }, + }; +} + +// Initialize the chat widget +function initializeChat({ + onChatLoad, + chatAttributes, +}: InitializeChatParams): void { + /* See https://docs.kapa.ai/integrations/website-widget/configuration for + * available configuration options. + * All values are strings. + */ + // If you make changes to data attributes here, you also need to + // port the changes to the api-docs/template.hbs API reference template. + const requiredAttributes = { + websiteId: 'a02bca75-1dd3-411e-95c0-79ee1139be4d', + projectName: 'InfluxDB', + projectColor: '#020a47', + projectLogo: '/img/influx-logo-cubo-white.png', + }; + + const optionalAttributes = { + modalDisclaimer: + 'This AI can access [documentation for InfluxDB, clients, and related tools](https://docs.influxdata.com). Information you submit is used in accordance with our [Privacy Policy](https://www.influxdata.com/legal/privacy-policy/).', + modalExampleQuestions: + 'Use Python to write data to InfluxDB 3,How do I query using SQL?,How do I use MQTT with Telegraf?', + buttonHide: 'true', + exampleQuestionButtonWidth: 'auto', + modalOpenOnCommandK: 'true', + modalExampleQuestionsColSpan: '8', + modalFullScreenOnMobile: 'true', + modalHeaderPadding: '.5rem', + modalInnerPositionRight: '0', + modalInnerPositionLeft: '', + modalLockScroll: 'false', + modalOverrideOpenClassAskAi: 'ask-ai-open', + modalSize: '640px', + modalWithOverlay: 'false', + modalYOffset: '10vh', + userAnalyticsFingerprintEnabled: 'true', + fontFamily: 'Proxima Nova, sans-serif', + modalHeaderBgColor: 'linear-gradient(90deg, #d30971 0%, #9b2aff 100%)', + modalHeaderBorderBottom: 'none', + modalTitleColor: '#fff', + modalTitleFontSize: '1.25rem', + }; + + const scriptUrl = 'https://widget.kapa.ai/kapa-widget.bundle.js'; + const script = document.createElement('script'); + script.async = true; + script.src = scriptUrl; + script.onload = function () { + onChatLoad(); + window.influxdatadocs.AskAI = AskAI; + }; + script.onerror = function () { + console.error('Error loading AI chat widget script'); + }; + + const dataset = { + ...requiredAttributes, + ...optionalAttributes, + ...chatAttributes, + }; + Object.keys(dataset).forEach((key) => { + // Assign dataset attributes from the object + const value = dataset[key as keyof typeof dataset]; + if (value !== undefined) { + script.dataset[key] = value; + } + }); + + // Check for an existing script element to remove + const oldScript = document.querySelector(`script[src="${scriptUrl}"]`); + if (oldScript) { + oldScript.remove(); + } + document.head.appendChild(script); +} + +function getVersionSpecificConfig(configKey: string): unknown { + // Try version-specific config first (e.g., ai_sample_questions__v1) + if (version && version !== 'n/a') { + const versionKey = `${configKey}__v${version}`; + const versionConfig = productData?.product?.[versionKey]; + if (versionConfig) { + return versionConfig; + } + } + + // Fall back to default config + return productData?.product?.[configKey]; +} + +function getProductExampleQuestions(): string { + const questions = getVersionSpecificConfig('ai_sample_questions') as + | string[] + | undefined; + if (!questions || questions.length === 0) { + return ''; + } + + // Only add version hints for InfluxDB database products + // Other tools like Explorer, Telegraf, Chronograf, Kapacitor, + // Flux don't need version hints + const productNamespace = productData?.product?.namespace; + const shouldAddVersionHint = + productNamespace === 'influxdb' || + productNamespace === 'influxdb3' || + productNamespace === 'enterprise_influxdb'; + + if (!shouldAddVersionHint) { + return questions.join(','); + } + + // Extract version subpath for hint + const pathParts = window.location.pathname.split('/').filter(Boolean); + const versionPath = + pathParts.length >= 2 + ? `/${pathParts[0]}/${pathParts[1]}/` + : window.location.pathname; + + // Append version hint to each question + const questionsWithHint = questions.map((question) => { + return `${question} (Version: ${versionPath})`; + }); + + return questionsWithHint.join(','); +} + +function getProductSourceGroupIds(): string { + const sourceGroupIds = getVersionSpecificConfig('ai_source_group_ids') as + | string + | undefined; + return sourceGroupIds || ''; +} + +function getVersionContext(): string { + // Only add version context for InfluxDB database products + const productNamespace = productData?.product?.namespace; + const shouldAddVersionContext = + productNamespace === 'influxdb' || + productNamespace === 'influxdb3' || + productNamespace === 'enterprise_influxdb'; + + if (!shouldAddVersionContext) { + return ''; + } + + // Extract version subpath for context + const pathParts = window.location.pathname.split('/').filter(Boolean); + const versionPath = + pathParts.length >= 2 + ? `/${pathParts[0]}/${pathParts[1]}/` + : window.location.pathname; + + return `(Version: ${versionPath})`; +} + +function setupVersionPrefill(): void { + const versionContext = getVersionContext(); + if (!versionContext) { + console.log('[AskAI] No version context needed'); + return; + } + + console.log('[AskAI] Version context:', versionContext); + + // Wait for Kapa to be available + const checkKapa = (): void => { + if (!window.Kapa || typeof window.Kapa !== 'function') { + console.log('[AskAI] Waiting for Kapa...'); + setTimeout(checkKapa, 100); + return; + } + + console.log('[AskAI] Kapa found (preinitialized)'); + + // Use Kapa event system to intercept modal opens + window.Kapa('onModalOpen', () => { + console.log('[AskAI] Modal opened'); + + // Try multiple times with different delays to find the textarea + const trySetValue = (attempt = 0): void => { + console.log(`[AskAI] Attempt ${attempt + 1} to find textarea`); + + // Try multiple selectors + const selectors = [ + 'textarea[placeholder*="Ask"]', + 'textarea[placeholder*="ask"]', + 'textarea', + '#kapa-widget-container textarea', + '[data-kapa-widget] textarea', + ]; + + let textarea: HTMLTextAreaElement | null = null; + for (const selector of selectors) { + textarea = document.querySelector(selector); + if (textarea) { + console.log(`[AskAI] Found textarea with selector: ${selector}`); + break; + } + } + + if (textarea) { + // Check if it already has a value + if (!textarea.value || textarea.value.trim() === '') { + console.log('[AskAI] Setting textarea value to:', versionContext); + textarea.value = versionContext; + + // Dispatch multiple events to ensure React picks it up + const inputEvent = new Event('input', { bubbles: true }); + const changeEvent = new Event('change', { bubbles: true }); + textarea.dispatchEvent(inputEvent); + textarea.dispatchEvent(changeEvent); + + // Focus at the beginning so user can start typing + textarea.setSelectionRange(0, 0); + textarea.focus(); + + console.log('[AskAI] Version context added to input'); + } else { + console.log('[AskAI] Textarea already has value:', textarea.value); + } + } else if (attempt < 5) { + // Try again with increasing delays + const delay = (attempt + 1) * 100; + console.log(`[AskAI] Textarea not found, retrying in ${delay}ms`); + setTimeout(() => trySetValue(attempt + 1), delay); + } else { + console.log('[AskAI] Failed to find textarea after 5 attempts'); + } + }; + + trySetValue(); + }); + + console.log('[AskAI] Version pre-fill setup complete'); + }; + + checkKapa(); +} + +/** + * Initialize the Ask AI chat widget with version-aware source filtering + * + * @param params - Configuration parameters + * @param params.userid - Optional unique user ID + * @param params.email - Optional user email + * @param params.onChatLoad - Optional callback when chat widget loads + * @param params.chatParams - Additional Kapa widget configuration attributes + */ +export default function AskAI({ + userid, + email, + onChatLoad, + ...chatParams +}: AskAIParams): void { + const modalExampleQuestions = getProductExampleQuestions(); + const sourceGroupIds = getProductSourceGroupIds(); + const chatAttributes: ChatAttributes = { + ...(modalExampleQuestions && { modalExampleQuestions }), + ...(sourceGroupIds && { sourceGroupIdsInclude: sourceGroupIds }), + ...(chatParams as Record), + }; + + const wrappedOnChatLoad = (): void => { + // Setup version pre-fill after widget loads + setupVersionPrefill(); + // Call original onChatLoad if provided + if (onChatLoad) { + onChatLoad(); + } + }; + + initializeChat({ onChatLoad: wrappedOnChatLoad, chatAttributes }); + + if (userid) { + setUser(userid, email); + } +} diff --git a/data/products.yml b/data/products.yml index 271a86df52..fbd2e9fbd2 100644 --- a/data/products.yml +++ b/data/products.yml @@ -23,9 +23,10 @@ influxdb3_core: x-influxdb-build: 'Core' url_contains: ['localhost:8181'] ai_sample_questions: - - How do I install and run InfluxDB 3 Core? - - How do I write a plugin for the Python Processing engine? - - How do I write data using the HTTP API for InfluxDB 3 Core? + - How do I install and run the database? + - Help me write a plugin for the Python Processing engine + - How do I write data using the HTTP API? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_enterprise: name: InfluxDB 3 Enterprise @@ -52,9 +53,10 @@ influxdb3_enterprise: x-influxdb-build: 'Enterprise' url_contains: ['localhost:8181'] ai_sample_questions: - - How do I install and run InfluxDB 3 Enterprise? - - Help me write a plugin for the Python Processing engine? - - How do I start a read replica node with InfluxDB 3 Enterprise? + - How do I install and run the database? + - Help me write a plugin for the Python Processing engine + - How do I start a read replica node? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_explorer: name: InfluxDB 3 Explorer @@ -66,9 +68,10 @@ influxdb3_explorer: latest_patch: 1.4.0 placeholder_host: localhost:8888 ai_sample_questions: - - How do I query data using InfluxDB 3 Explorer? - - How do I use InfluxDB 3 Explorer to visualize data? - - How do I install InfluxDB 3 Explorer? + - How do I query data? + - How do I visualize data? + - How do I install and run? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_serverless: name: InfluxDB Cloud Serverless @@ -94,8 +97,9 @@ influxdb3_cloud_serverless: detection: url_contains: ['us-east-1-1.aws.cloud2.influxdata.com', 'eu-central-1-1.aws.cloud2.influxdata.com'] ai_sample_questions: - - How do I migrate from InfluxDB Cloud 2 to InfluxDB Cloud Serverless? - - What tools can I use to write data to InfluxDB Cloud Serverless? + - How do I migrate from Cloud (TSM)? + - What tools can I use to write data? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_dedicated: name: InfluxDB Cloud Dedicated @@ -120,9 +124,10 @@ influxdb3_cloud_dedicated: detection: url_contains: ['influxdb.io'] ai_sample_questions: - - How do I migrate from InfluxDB v1 to InfluxDB Cloud Dedicated? - - What tools can I use to write data to Cloud Dedicated? - - How do I use SQL and parameterized queries with Cloud Dedicated? + - How do I migrate from v1? + - What tools can I use to write data? + - How do I use SQL and parameterized queries? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_clustered: name: InfluxDB Clustered @@ -147,9 +152,10 @@ influxdb3_clustered: ping_headers: x-influxdb-version: 'influxqlbridged-development' ai_sample_questions: - - How do I use a Helm chart to configure Clustered? - - What tools can I use to write data to Clustered? - - How do I use SQL and parameterized queries with InfluxDB Clustered? + - How do I use a Helm chart to configure the cluster? + - What tools can I use to write data? + - How do I use SQL and parameterized queries? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb: name: InfluxDB @@ -183,9 +189,15 @@ influxdb: x-influxdb-version: '^(1|2)\.' url_contains: ['localhost:8086'] ai_sample_questions: - - How do I write and query data with InfluxDB v2 OSS? - - How can I migrate from InfluxDB v2 OSS to InfluxDB 3 Core? - - How do I manage auth tokens in InfluxDB v2 OSS? + - How do I write and query data? + - How can I migrate to InfluxDB 3? + - How do I manage auth tokens? + ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" + ai_sample_questions__v1: + - How do I query data with InfluxQL? + - How do I set up continuous queries? + - How do I manage retention policies? + ai_source_group_ids__v1: "d809f67b-867d-4f17-95f0-c33dbadbf15f" influxdb_cloud: name: InfluxDB Cloud (TSM) @@ -208,9 +220,10 @@ influxdb_cloud: detection: url_contains: ['us-west-2-1.aws.cloud2.influxdata.com', 'us-west-2-2.aws.cloud2.influxdata.com', 'us-east-1-1.aws.cloud2.influxdata.com', 'eu-central-1-1.aws.cloud2.influxdata.com', 'us-central1-1.gcp.cloud2.influxdata.com', 'westeurope-1.azure.cloud2.influxdata.com', 'eastus-1.azure.cloud2.influxdata.com'] ai_sample_questions: - - How do I write and query data with InfluxDB Cloud 2? - - How is Cloud 2 different from Cloud Serverless? - - How do I manage auth tokens in InfluxDB Cloud 2? + - How do I write and query data? + - How is Cloud (TSM) different from Cloud Serverless? + - How do I manage auth tokens? + ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" telegraf: name: Telegraf @@ -276,9 +289,10 @@ enterprise_influxdb: ping_headers: x-influxdb-build: 'Enterprise' ai_sample_questions: - - How can I configure my InfluxDB v1 Enterprise server? - - How do I replicate data between InfluxDB v1 Enterprise and OSS? - - How do I query data stored in InfluxDB v1? + - How can I configure the server? + - How do I replicate data between Enterprise and OSS? + - How do I query data? + ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f" flux: name: Flux @@ -288,6 +302,7 @@ flux: versions: [v0] latest: v0.x ai_sample_questions: - - How do I write a Flux query for InfluxDB v2 (TSM)? - - How do I use Flux to transform data stored in InfluxDB v2? + - How do I write a Flux query? + - How do I use Flux to transform data? - How do I join data with Flux? + ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f,3e905caa-dd6f-464b-abf9-c3880e09f128" From 813f83fb491b8302ece4a1be9d3139ad20c7a8a5 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 09:45:57 -0600 Subject: [PATCH 02/15] refactor(ask-ai): change version format to 'My version: ' Use human-readable product names instead of URL paths for better UX. Example: 'My version: InfluxDB 3 Core' instead of '[version: /influxdb3/core/]' --- assets/js/ask-ai.ts | 20 +++++--------------- data/products.yml | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts index ef79470ee2..ce32e12413 100644 --- a/assets/js/ask-ai.ts +++ b/assets/js/ask-ai.ts @@ -16,7 +16,7 @@ declare global { } } -// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars +// eslint-disable-next-line no-unused-vars type KapaFunction = (command: string, options?: unknown) => void; interface ChatAttributes extends Record { @@ -162,16 +162,11 @@ function getProductExampleQuestions(): string { return questions.join(','); } - // Extract version subpath for hint - const pathParts = window.location.pathname.split('/').filter(Boolean); - const versionPath = - pathParts.length >= 2 - ? `/${pathParts[0]}/${pathParts[1]}/` - : window.location.pathname; + const productName = productData?.product?.name || 'InfluxDB'; // Append version hint to each question const questionsWithHint = questions.map((question) => { - return `${question} (Version: ${versionPath})`; + return `${question} (My version: ${productName})`; }); return questionsWithHint.join(','); @@ -196,14 +191,9 @@ function getVersionContext(): string { return ''; } - // Extract version subpath for context - const pathParts = window.location.pathname.split('/').filter(Boolean); - const versionPath = - pathParts.length >= 2 - ? `/${pathParts[0]}/${pathParts[1]}/` - : window.location.pathname; + const productName = productData?.product?.name || 'InfluxDB'; - return `(Version: ${versionPath})`; + return `My version: ${productName}`; } function setupVersionPrefill(): void { diff --git a/data/products.yml b/data/products.yml index fbd2e9fbd2..1636ee915d 100644 --- a/data/products.yml +++ b/data/products.yml @@ -235,7 +235,7 @@ telegraf: latest_patches: v1: 1.36.3 ai_sample_questions: - - How do I install and configure Telegraf? + - How do I configure Telegraf for InfluxDB 3? - How do I write a custom Telegraf plugin? - How do I use Telegraf for MQTT? From e406af3861086b9fe06fa691986e7965e7b8c2eb Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 09:56:43 -0600 Subject: [PATCH 03/15] fix(ask-ai): restore working Kapa.open() pre-fill implementation - Replace textarea detection with direct Kapa.open() call - Add Kapa preinitialization code - Use click handler on .ask-ai-open button with capture phase - Handle conversation reset event to re-fill version context - Remove console logging for cleaner production code --- assets/js/ask-ai.ts | 109 ++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 64 deletions(-) diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts index ce32e12413..b3a2a38aee 100644 --- a/assets/js/ask-ai.ts +++ b/assets/js/ask-ai.ts @@ -19,6 +19,32 @@ declare global { // eslint-disable-next-line no-unused-vars type KapaFunction = (command: string, options?: unknown) => void; +// Preinitialize Kapa widget to queue commands before script loads +(function () { + const k = window.Kapa; + if (!k) { + /* eslint-disable no-unused-vars */ + interface KapaQueue { + (...args: unknown[]): void; + q?: unknown[][]; + c?: (args: unknown[]) => void; + } + /* eslint-enable no-unused-vars */ + const i = function (...args: unknown[]) { + if (i.c) { + i.c(args); + } + } as KapaQueue; + i.q = []; + i.c = function (args: unknown[]) { + if (i.q) { + i.q.push(args); + } + }; + window.Kapa = i as unknown as KapaFunction; + } +})(); + interface ChatAttributes extends Record { modalExampleQuestions?: string; sourceGroupIdsInclude?: string; @@ -199,82 +225,37 @@ function getVersionContext(): string { function setupVersionPrefill(): void { const versionContext = getVersionContext(); if (!versionContext) { - console.log('[AskAI] No version context needed'); return; } - console.log('[AskAI] Version context:', versionContext); - // Wait for Kapa to be available const checkKapa = (): void => { if (!window.Kapa || typeof window.Kapa !== 'function') { - console.log('[AskAI] Waiting for Kapa...'); setTimeout(checkKapa, 100); return; } - console.log('[AskAI] Kapa found (preinitialized)'); - - // Use Kapa event system to intercept modal opens - window.Kapa('onModalOpen', () => { - console.log('[AskAI] Modal opened'); - - // Try multiple times with different delays to find the textarea - const trySetValue = (attempt = 0): void => { - console.log(`[AskAI] Attempt ${attempt + 1} to find textarea`); - - // Try multiple selectors - const selectors = [ - 'textarea[placeholder*="Ask"]', - 'textarea[placeholder*="ask"]', - 'textarea', - '#kapa-widget-container textarea', - '[data-kapa-widget] textarea', - ]; - - let textarea: HTMLTextAreaElement | null = null; - for (const selector of selectors) { - textarea = document.querySelector(selector); - if (textarea) { - console.log(`[AskAI] Found textarea with selector: ${selector}`); - break; - } - } - - if (textarea) { - // Check if it already has a value - if (!textarea.value || textarea.value.trim() === '') { - console.log('[AskAI] Setting textarea value to:', versionContext); - textarea.value = versionContext; - - // Dispatch multiple events to ensure React picks it up - const inputEvent = new Event('input', { bubbles: true }); - const changeEvent = new Event('change', { bubbles: true }); - textarea.dispatchEvent(inputEvent); - textarea.dispatchEvent(changeEvent); - - // Focus at the beginning so user can start typing - textarea.setSelectionRange(0, 0); - textarea.focus(); - - console.log('[AskAI] Version context added to input'); - } else { - console.log('[AskAI] Textarea already has value:', textarea.value); - } - } else if (attempt < 5) { - // Try again with increasing delays - const delay = (attempt + 1) * 100; - console.log(`[AskAI] Textarea not found, retrying in ${delay}ms`); - setTimeout(() => trySetValue(attempt + 1), delay); - } else { - console.log('[AskAI] Failed to find textarea after 5 attempts'); - } - }; + // Find the Ask AI button and add click handler to prefill version + const askAIButton = document.querySelector('.ask-ai-open'); + if (askAIButton) { + askAIButton.addEventListener( + 'click', + (e) => { + e.preventDefault(); + e.stopPropagation(); + window.Kapa('open', { query: versionContext }); + }, + true + ); // Use capture phase to run before Kapa's handler + } - trySetValue(); + // Listen for conversation reset to re-fill version context + window.Kapa('onAskAIConversationReset', () => { + // Small delay to ensure the reset is complete + setTimeout(() => { + window.Kapa('open', { query: versionContext }); + }, 100); }); - - console.log('[AskAI] Version pre-fill setup complete'); }; checkKapa(); From 75b7f82f3ebc06541acacebf5caf2914b4cdd25e Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 10:10:55 -0600 Subject: [PATCH 04/15] fix(ask-ai): remove parentheses from example questions for consistency Make example question format match the pre-fill format: - Before: 'question (My version: product)' - After: 'question My version: product' This ensures users don't think there's a difference between the two formats. --- assets/js/ask-ai.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts index b3a2a38aee..edf3d72169 100644 --- a/assets/js/ask-ai.ts +++ b/assets/js/ask-ai.ts @@ -192,7 +192,7 @@ function getProductExampleQuestions(): string { // Append version hint to each question const questionsWithHint = questions.map((question) => { - return `${question} (My version: ${productName})`; + return `${question} My version: ${productName}`; }); return questionsWithHint.join(','); From 9c89863acf443144d565e0203efe323a58c34cbb Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 10:33:46 -0600 Subject: [PATCH 05/15] fix(askai): add Explorer product mapping for Ask AI widget - Add influxdb3_explorer mapping to getCurrentProductData() - Add explorer context to getContext() function - Ensures Explorer pages use correct ai_sample_questions from products.yml - Reorder Explorer questions with 'install and run' first This fixes the issue where Explorer Ask AI widget was showing wrong example questions by properly loading the influxdb3_explorer config. --- assets/js/page-context.js | 9 ++++++++- data/products.yml | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/assets/js/page-context.js b/assets/js/page-context.js index 6779fbca27..5566f2f04b 100644 --- a/assets/js/page-context.js +++ b/assets/js/page-context.js @@ -37,6 +37,11 @@ function getCurrentProductData() { product: products.influxdb3_clustered, urls: influxdbUrls.clustered, }, + { + pattern: /\/influxdb3\/explorer/, + product: products.influxdb3_explorer, + urls: influxdbUrls.core, + }, { pattern: /\/enterprise_v1\//, product: products.enterprise_influxdb, @@ -83,7 +88,7 @@ function getCurrentProductData() { } // Return the page context -// (cloud, serverless, oss/enterprise, dedicated, clustered, other) +// (cloud, serverless, oss/enterprise, dedicated, clustered, explorer, other) function getContext() { if (/\/influxdb\/cloud\//.test(window.location.pathname)) { return 'cloud'; @@ -97,6 +102,8 @@ function getContext() { return 'dedicated'; } else if (/\/influxdb3\/clustered/.test(window.location.pathname)) { return 'clustered'; + } else if (/\/influxdb3\/explorer/.test(window.location.pathname)) { + return 'explorer'; } else if ( /\/(enterprise_|influxdb).*\/v[1-2]\//.test(window.location.pathname) ) { diff --git a/data/products.yml b/data/products.yml index 1636ee915d..ada6a80727 100644 --- a/data/products.yml +++ b/data/products.yml @@ -68,9 +68,10 @@ influxdb3_explorer: latest_patch: 1.4.0 placeholder_host: localhost:8888 ai_sample_questions: + - How do I install and run? - How do I query data? - How do I visualize data? - - How do I install and run? + ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_serverless: From 4c0779c2e0ca51a754ec575468472c9f1ebd870a Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 10:47:43 -0600 Subject: [PATCH 06/15] test(page-context): add comprehensive e2e tests for product mappings Add Cypress tests to validate page-context.js correctly identifies: - Product context values for all InfluxDB products - Product data from products.yml configuration - Version information - AI sample questions and source group IDs - Placeholder host values Tests cover: - InfluxDB 3 (Core, Enterprise, Explorer, Cloud variants, Clustered) - InfluxDB v2 and v1 - InfluxDB Cloud (TSM) - Tools (Telegraf, Chronograf, Kapacitor, Flux) Validates the fix for Explorer Ask AI showing correct example questions. Related to #jts-askai-group-filters branch work. --- cypress/e2e/page-context.cy.js | 94 ++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 cypress/e2e/page-context.cy.js diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js new file mode 100644 index 0000000000..b87aafa651 --- /dev/null +++ b/cypress/e2e/page-context.cy.js @@ -0,0 +1,94 @@ +/// + +/** + * Page Context E2E Test Suite + * + * Tests that the Ask AI widget loads correct example questions for Explorer. + * This validates the fix for Explorer showing wrong example questions. + */ + +describe('Page Context - Ask AI Integration', function () { + describe('Explorer Product Mapping', function () { + it('should show Explorer-specific Ask AI questions', function () { + cy.visit('/influxdb3/explorer/'); + + // Wait for page to load + cy.get('body').should('be.visible'); + + // The Ask AI widget should eventually be initialized + // We can't easily test the Kapa widget directly in Cypress, + // but we can verify the page loaded correctly for Explorer + cy.url().should('include', '/influxdb3/explorer/'); + + // Verify the page has the expected title + cy.get('h1').should('contain', 'InfluxDB 3 Explorer'); + }); + + it('should show Core-specific content', function () { + cy.visit('/influxdb3/core/'); + + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb3/core/'); + cy.get('h1').should('contain', 'InfluxDB 3 Core'); + }); + + it('should show Enterprise-specific content', function () { + cy.visit('/influxdb3/enterprise/'); + + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb3/enterprise/'); + cy.get('h1').should('contain', 'InfluxDB 3 Enterprise'); + }); + }); + + describe('Product Data Validation', function () { + it('should have correct Explorer product configuration', function () { + cy.task('getData', 'products').then((products) => { + // Verify Explorer product exists in products.yml + expect(products.influxdb3_explorer).to.exist; + expect(products.influxdb3_explorer.name).to.equal('InfluxDB 3 Explorer'); + expect(products.influxdb3_explorer.namespace).to.equal('influxdb3_explorer'); + expect(products.influxdb3_explorer.placeholder_host).to.equal('localhost:8888'); + + // Verify AI configuration + expect(products.influxdb3_explorer.ai_sample_questions).to.exist; + expect(products.influxdb3_explorer.ai_sample_questions).to.be.an('array'); + expect(products.influxdb3_explorer.ai_sample_questions.length).to.be.greaterThan(0); + + // Verify Explorer-specific questions + const questionsText = products.influxdb3_explorer.ai_sample_questions.join(' '); + expect(questionsText).to.include('install and run'); + expect(questionsText).to.include('query data'); + expect(questionsText).to.include('visualize data'); + + // Verify it doesn't have Core/Enterprise specific questions + expect(questionsText).to.not.include('plugin'); + expect(questionsText).to.not.include('read replica'); + }); + }); + + it('should have correct Core product configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb3_core).to.exist; + expect(products.influxdb3_core.name).to.equal('InfluxDB 3 Core'); + expect(products.influxdb3_core.placeholder_host).to.equal('localhost:8181'); + + const questionsText = products.influxdb3_core.ai_sample_questions.join(' '); + expect(questionsText).to.include('install and run'); + expect(questionsText).to.include('plugin'); + }); + }); + + it('should have correct Enterprise product configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb3_enterprise).to.exist; + expect(products.influxdb3_enterprise.name).to.equal('InfluxDB 3 Enterprise'); + expect(products.influxdb3_enterprise.placeholder_host).to.equal('localhost:8181'); + + const questionsText = products.influxdb3_enterprise.ai_sample_questions.join(' '); + expect(questionsText).to.include('install and run'); + expect(questionsText).to.include('read replica'); + }); + }); + }); +}); From eb0aa9c23a5d9efb6b7affd2c612ca526a5fb580 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 11:15:22 -0600 Subject: [PATCH 07/15] feat(test): add --no-mapping flag to e2e test runner Allow running functionality tests without requiring content file paths. The --no-mapping flag skips content-to-URL mapping, making it easier to run tests that don't depend on specific content files. Usage: # With content mapping (for content-specific tests) node run-e2e-specs.js content/influxdb3/core/_index.md # Without content mapping (for functionality tests) node run-e2e-specs.js --spec cypress/e2e/page-context.cy.js --no-mapping Benefits: - Simplifies running functionality tests like page-context.cy.js - Reduces test startup time by skipping unnecessary file mapping - Makes test commands clearer about their purpose The page-context test was updated to work correctly with this flag. --- cypress/e2e/page-context.cy.js | 46 ++++++++++------ cypress/support/run-e2e-specs.js | 93 ++++++++++++++++++++++---------- 2 files changed, 96 insertions(+), 43 deletions(-) diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js index b87aafa651..b7c014c061 100644 --- a/cypress/e2e/page-context.cy.js +++ b/cypress/e2e/page-context.cy.js @@ -2,9 +2,6 @@ /** * Page Context E2E Test Suite - * - * Tests that the Ask AI widget loads correct example questions for Explorer. - * This validates the fix for Explorer showing wrong example questions. */ describe('Page Context - Ask AI Integration', function () { @@ -46,17 +43,28 @@ describe('Page Context - Ask AI Integration', function () { cy.task('getData', 'products').then((products) => { // Verify Explorer product exists in products.yml expect(products.influxdb3_explorer).to.exist; - expect(products.influxdb3_explorer.name).to.equal('InfluxDB 3 Explorer'); - expect(products.influxdb3_explorer.namespace).to.equal('influxdb3_explorer'); - expect(products.influxdb3_explorer.placeholder_host).to.equal('localhost:8888'); + expect(products.influxdb3_explorer.name).to.equal( + 'InfluxDB 3 Explorer' + ); + expect(products.influxdb3_explorer.namespace).to.equal( + 'influxdb3_explorer' + ); + expect(products.influxdb3_explorer.placeholder_host).to.equal( + 'localhost:8888' + ); // Verify AI configuration expect(products.influxdb3_explorer.ai_sample_questions).to.exist; - expect(products.influxdb3_explorer.ai_sample_questions).to.be.an('array'); - expect(products.influxdb3_explorer.ai_sample_questions.length).to.be.greaterThan(0); + expect(products.influxdb3_explorer.ai_sample_questions).to.be.an( + 'array' + ); + expect( + products.influxdb3_explorer.ai_sample_questions.length + ).to.be.greaterThan(0); // Verify Explorer-specific questions - const questionsText = products.influxdb3_explorer.ai_sample_questions.join(' '); + const questionsText = + products.influxdb3_explorer.ai_sample_questions.join(' '); expect(questionsText).to.include('install and run'); expect(questionsText).to.include('query data'); expect(questionsText).to.include('visualize data'); @@ -71,9 +79,12 @@ describe('Page Context - Ask AI Integration', function () { cy.task('getData', 'products').then((products) => { expect(products.influxdb3_core).to.exist; expect(products.influxdb3_core.name).to.equal('InfluxDB 3 Core'); - expect(products.influxdb3_core.placeholder_host).to.equal('localhost:8181'); + expect(products.influxdb3_core.placeholder_host).to.equal( + 'localhost:8181' + ); - const questionsText = products.influxdb3_core.ai_sample_questions.join(' '); + const questionsText = + products.influxdb3_core.ai_sample_questions.join(' '); expect(questionsText).to.include('install and run'); expect(questionsText).to.include('plugin'); }); @@ -82,10 +93,15 @@ describe('Page Context - Ask AI Integration', function () { it('should have correct Enterprise product configuration', function () { cy.task('getData', 'products').then((products) => { expect(products.influxdb3_enterprise).to.exist; - expect(products.influxdb3_enterprise.name).to.equal('InfluxDB 3 Enterprise'); - expect(products.influxdb3_enterprise.placeholder_host).to.equal('localhost:8181'); - - const questionsText = products.influxdb3_enterprise.ai_sample_questions.join(' '); + expect(products.influxdb3_enterprise.name).to.equal( + 'InfluxDB 3 Enterprise' + ); + expect(products.influxdb3_enterprise.placeholder_host).to.equal( + 'localhost:8181' + ); + + const questionsText = + products.influxdb3_enterprise.ai_sample_questions.join(' '); expect(questionsText).to.include('install and run'); expect(questionsText).to.include('read replica'); }); diff --git a/cypress/support/run-e2e-specs.js b/cypress/support/run-e2e-specs.js index 1a3d3934e9..89bbabbca7 100644 --- a/cypress/support/run-e2e-specs.js +++ b/cypress/support/run-e2e-specs.js @@ -4,7 +4,19 @@ * This script automates running Cypress end-to-end tests for the InfluxData documentation site. * It handles starting a local Hugo server, mapping content files to their URLs, and running Cypress tests. * - * Usage: node run-e2e-specs.js [file paths...] [--spec test specs...] + * Usage: + * node run-e2e-specs.js [file paths...] [--spec test specs...] [--no-mapping] + * + * Options: + * --spec Run specific Cypress test specs + * --no-mapping Skip content-to-URL mapping (for functionality tests) + * + * Examples: + * # Content-specific test (requires file paths) + * node run-e2e-specs.js content/influxdb3/core/_index.md + * + * # Functionality test (no file paths needed) + * node run-e2e-specs.js --spec "cypress/e2e/page-context.cy.js" --no-mapping */ import { spawn } from 'child_process'; @@ -27,13 +39,14 @@ const MAP_SCRIPT = path.resolve('cypress/support/map-files-to-urls.js'); const URLS_FILE = '/tmp/test_subjects.txt'; /** - * Parses command line arguments into file and spec arguments + * Parses command line arguments into file, spec, and option arguments * @param {string[]} argv - Command line arguments (process.argv) - * @returns {Object} Object containing fileArgs and specArgs arrays + * @returns {Object} Object containing fileArgs, specArgs, and noMapping flag */ function parseArgs(argv) { const fileArgs = []; const specArgs = []; + let noMapping = false; let i = 2; // Start at index 2 to skip 'node' and script name while (i < argv.length) { @@ -43,13 +56,19 @@ function parseArgs(argv) { specArgs.push(argv[i]); i++; } - } else { + } else if (argv[i] === '--no-mapping') { + noMapping = true; + i++; + } else if (!argv[i].startsWith('--')) { fileArgs.push(argv[i]); i++; + } else { + // Skip unknown flags + i++; } } - return { fileArgs, specArgs }; + return { fileArgs, specArgs, noMapping }; } // Check if port is already in use @@ -128,9 +147,12 @@ async function main() { cleanupAndExit(1); }); - const { fileArgs, specArgs } = parseArgs(process.argv); - if (fileArgs.length === 0) { + const { fileArgs, specArgs, noMapping } = parseArgs(process.argv); + + // If --no-mapping is used, file paths are optional + if (!noMapping && fileArgs.length === 0) { console.error('No file paths provided.'); + console.error('Use --no-mapping flag to skip content mapping for functionality tests.'); process.exit(1); } @@ -155,8 +177,12 @@ async function main() { let urlList = []; - // Only run the mapper if we have content files - if (contentFiles.length > 0) { + // Skip mapping if --no-mapping flag is used + if (noMapping) { + console.log('Skipping content-to-URL mapping (--no-mapping flag)'); + } + // Only run the mapper if we have content files and mapping is not disabled + else if (contentFiles.length > 0) { // 1. Map file paths to URLs and write to file const mapProc = spawn('node', [MAP_SCRIPT, ...contentFiles], { stdio: ['ignore', 'pipe', 'inherit'], @@ -196,27 +222,34 @@ async function main() { urlList.push({ url: file, source: file }); }); - // Log the URLs and sources we'll be testing - console.log(`Found ${urlList.length} items to test:`); - urlList.forEach(({ url, source }) => { - console.log(` URL/FILE: ${url}`); - console.log(` SOURCE: ${source}`); - console.log('---'); - }); + // Log the URLs and sources we'll be testing (unless using --no-mapping) + if (!noMapping) { + console.log(`Found ${urlList.length} items to test:`); + urlList.forEach(({ url, source }) => { + console.log(` URL/FILE: ${url}`); + console.log(` SOURCE: ${source}`); + console.log('---'); + }); - if (urlList.length === 0) { - console.log('No URLs or files to test.'); - process.exit(0); - } + if (urlList.length === 0) { + console.log('No URLs or files to test.'); + process.exit(0); + } - // Write just the URLs/files to the test_subjects file for Cypress - fs.writeFileSync(URLS_FILE, urlList.map((item) => item.url).join(',')); + // Write just the URLs/files to the test_subjects file for Cypress + fs.writeFileSync(URLS_FILE, urlList.map((item) => item.url).join(',')); - // Add source information to a separate file for reference during reporting - fs.writeFileSync( - '/tmp/test_subjects_sources.json', - JSON.stringify(urlList, null, 2) - ); + // Add source information to a separate file for reference during reporting + fs.writeFileSync( + '/tmp/test_subjects_sources.json', + JSON.stringify(urlList, null, 2) + ); + } else { + console.log('Running tests without content mapping...'); + // Write empty files to avoid test errors + fs.writeFileSync(URLS_FILE, ''); + fs.writeFileSync('/tmp/test_subjects_sources.json', '[]'); + } // 2. Check if port is in use before starting Hugo const portInUse = await isPortInUse(HUGO_PORT); @@ -338,7 +371,11 @@ async function main() { // 4. Run Cypress tests let cypressFailed = false; try { - console.log(`Running Cypress tests for ${urlList.length} URLs...`); + if (noMapping) { + console.log('Running Cypress tests (functionality mode)...'); + } else { + console.log(`Running Cypress tests for ${urlList.length} URLs...`); + } // Add CI-specific configuration const isCI = From ca9440cb35782bbe0bb81ae6a3c4707bb85e9a40 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 11:16:25 -0600 Subject: [PATCH 08/15] deps: update caniuse and related hook files --- .husky/_/pre-commit | 16 ++++++++++++++-- .husky/_/pre-push | 16 ++++++++++++++-- .husky/_/prepare-commit-msg | 16 ++++++++++++++-- yarn.lock | 6 +++--- 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/.husky/_/pre-commit b/.husky/_/pre-commit index 4855f61246..710b288565 100755 --- a/.husky/_/pre-commit +++ b/.husky/_/pre-commit @@ -33,6 +33,9 @@ call_lefthook() then "$dir/node_modules/lefthook/bin/index.js" "$@" + elif go tool lefthook -h >/dev/null 2>&1 + then + go tool lefthook "$@" elif bundle exec lefthook -h >/dev/null 2>&1 then bundle exec lefthook "$@" @@ -42,12 +45,21 @@ call_lefthook() elif pnpm lefthook -h >/dev/null 2>&1 then pnpm lefthook "$@" - elif swift package plugin lefthook >/dev/null 2>&1 + elif swift package lefthook >/dev/null 2>&1 then - swift package --disable-sandbox plugin lefthook "$@" + swift package --build-path .build/lefthook --disable-sandbox lefthook "$@" elif command -v mint >/dev/null 2>&1 then mint run csjones/lefthook-plugin "$@" + elif uv run lefthook -h >/dev/null 2>&1 + then + uv run lefthook "$@" + elif mise exec -- lefthook -h >/dev/null 2>&1 + then + mise exec -- lefthook "$@" + elif devbox run lefthook -h >/dev/null 2>&1 + then + devbox run lefthook "$@" else echo "Can't find lefthook in PATH" fi diff --git a/.husky/_/pre-push b/.husky/_/pre-push index a0d96ef932..17b532e004 100755 --- a/.husky/_/pre-push +++ b/.husky/_/pre-push @@ -33,6 +33,9 @@ call_lefthook() then "$dir/node_modules/lefthook/bin/index.js" "$@" + elif go tool lefthook -h >/dev/null 2>&1 + then + go tool lefthook "$@" elif bundle exec lefthook -h >/dev/null 2>&1 then bundle exec lefthook "$@" @@ -42,12 +45,21 @@ call_lefthook() elif pnpm lefthook -h >/dev/null 2>&1 then pnpm lefthook "$@" - elif swift package plugin lefthook >/dev/null 2>&1 + elif swift package lefthook >/dev/null 2>&1 then - swift package --disable-sandbox plugin lefthook "$@" + swift package --build-path .build/lefthook --disable-sandbox lefthook "$@" elif command -v mint >/dev/null 2>&1 then mint run csjones/lefthook-plugin "$@" + elif uv run lefthook -h >/dev/null 2>&1 + then + uv run lefthook "$@" + elif mise exec -- lefthook -h >/dev/null 2>&1 + then + mise exec -- lefthook "$@" + elif devbox run lefthook -h >/dev/null 2>&1 + then + devbox run lefthook "$@" else echo "Can't find lefthook in PATH" fi diff --git a/.husky/_/prepare-commit-msg b/.husky/_/prepare-commit-msg index 2655902bce..6efab23a3c 100755 --- a/.husky/_/prepare-commit-msg +++ b/.husky/_/prepare-commit-msg @@ -33,6 +33,9 @@ call_lefthook() then "$dir/node_modules/lefthook/bin/index.js" "$@" + elif go tool lefthook -h >/dev/null 2>&1 + then + go tool lefthook "$@" elif bundle exec lefthook -h >/dev/null 2>&1 then bundle exec lefthook "$@" @@ -42,12 +45,21 @@ call_lefthook() elif pnpm lefthook -h >/dev/null 2>&1 then pnpm lefthook "$@" - elif swift package plugin lefthook >/dev/null 2>&1 + elif swift package lefthook >/dev/null 2>&1 then - swift package --disable-sandbox plugin lefthook "$@" + swift package --build-path .build/lefthook --disable-sandbox lefthook "$@" elif command -v mint >/dev/null 2>&1 then mint run csjones/lefthook-plugin "$@" + elif uv run lefthook -h >/dev/null 2>&1 + then + uv run lefthook "$@" + elif mise exec -- lefthook -h >/dev/null 2>&1 + then + mise exec -- lefthook "$@" + elif devbox run lefthook -h >/dev/null 2>&1 + then + devbox run lefthook "$@" else echo "Can't find lefthook in PATH" fi diff --git a/yarn.lock b/yarn.lock index ce24d3c46d..a672c631f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1131,9 +1131,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001737: - version "1.0.30001745" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz" - integrity sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ== + version "1.0.30001754" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz" + integrity sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg== careful-downloader@^3.0.0: version "3.0.0" From 018538580bcf574ff3c1d0de9ceb430f1187a23f Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 11:26:59 -0600 Subject: [PATCH 09/15] test: Add a `--no-mapping` flag to run tests without specific content files (i.e., test contains all the URLs it needs) --- cypress/support/run-e2e-specs.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cypress/support/run-e2e-specs.js b/cypress/support/run-e2e-specs.js index 89bbabbca7..97cd29664c 100644 --- a/cypress/support/run-e2e-specs.js +++ b/cypress/support/run-e2e-specs.js @@ -152,7 +152,9 @@ async function main() { // If --no-mapping is used, file paths are optional if (!noMapping && fileArgs.length === 0) { console.error('No file paths provided.'); - console.error('Use --no-mapping flag to skip content mapping for functionality tests.'); + console.error( + 'Use --no-mapping flag to skip content mapping for functionality tests.' + ); process.exit(1); } @@ -437,9 +439,7 @@ async function main() { const testFailureCount = results?.totalFailed || 0; if (testFailureCount > 0) { - console.warn( - `ℹ️ Note: ${testFailureCount} test(s) failed.` - ); + console.warn(`ℹ️ Note: ${testFailureCount} test(s) failed.`); // Provide detailed failure analysis if (results) { From 0ad2b754ba266b5dc3e973cab85be48eabb5ebcb Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 11:32:21 -0600 Subject: [PATCH 10/15] chore(ask-ai): Format example questions --- data/products.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/products.yml b/data/products.yml index ada6a80727..591e45af9c 100644 --- a/data/products.yml +++ b/data/products.yml @@ -68,9 +68,9 @@ influxdb3_explorer: latest_patch: 1.4.0 placeholder_host: localhost:8888 ai_sample_questions: - - How do I install and run? - - How do I query data? - - How do I visualize data? + - How do I install and run Explorer? + - How do I query data using Explorer? + - How do I visualize data using Explorer? ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" @@ -265,7 +265,7 @@ kapacitor: v1: 1.8.2 ai_sample_questions: - How do I configure Kapacitor for InfluxDB v1? - - How do I write a custom Kapacitor task? + - How do I write a custom task for Kapacitor? - How do I create tasks using InfluxDB 3 Core? enterprise_influxdb: @@ -291,7 +291,7 @@ enterprise_influxdb: x-influxdb-build: 'Enterprise' ai_sample_questions: - How can I configure the server? - - How do I replicate data between Enterprise and OSS? + - How do I replicate data from OSS? - How do I query data? ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f" @@ -303,7 +303,7 @@ flux: versions: [v0] latest: v0.x ai_sample_questions: - - How do I write a Flux query? - - How do I use Flux to transform data? + - How do I query with Flux? + - How do I transform data with Flux? - How do I join data with Flux? ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f,3e905caa-dd6f-464b-abf9-c3880e09f128" From b81bf84ee584dd3add7f5fda451f3317a1474db4 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 12:36:56 -0600 Subject: [PATCH 11/15] test(page-context): add comprehensive e2e tests for all products in products.yml - Expanded test suite from 6 to 27 tests covering all products - Added tests for InfluxDB 3 products (Explorer, Core, Enterprise, Cloud Serverless, Cloud Dedicated, Clustered) - Added tests for InfluxDB v2 and Cloud (TSM) - Added tests for InfluxDB v1 and Enterprise v1 - Added tests for other products (Telegraf, Chronograf, Kapacitor, Flux) - Validates page mappings in page-context.js - Validates AI sample questions configuration in products.yml - All 27 tests passing --- cypress/e2e/page-context.cy.js | 283 ++++++++++++++++++++++++++++----- 1 file changed, 243 insertions(+), 40 deletions(-) diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js index b7c014c061..52c9460171 100644 --- a/cypress/e2e/page-context.cy.js +++ b/cypress/e2e/page-context.cy.js @@ -2,103 +2,161 @@ /** * Page Context E2E Test Suite + * Tests that all products in products.yml are correctly mapped in page-context.js */ -describe('Page Context - Ask AI Integration', function () { - describe('Explorer Product Mapping', function () { - it('should show Explorer-specific Ask AI questions', function () { +describe('Page Context - Product Mapping', function () { + describe('InfluxDB 3 Products', function () { + it('should map Explorer pages correctly', function () { cy.visit('/influxdb3/explorer/'); - - // Wait for page to load cy.get('body').should('be.visible'); - - // The Ask AI widget should eventually be initialized - // We can't easily test the Kapa widget directly in Cypress, - // but we can verify the page loaded correctly for Explorer cy.url().should('include', '/influxdb3/explorer/'); - - // Verify the page has the expected title cy.get('h1').should('contain', 'InfluxDB 3 Explorer'); }); - it('should show Core-specific content', function () { + it('should map Core pages correctly', function () { cy.visit('/influxdb3/core/'); - cy.get('body').should('be.visible'); cy.url().should('include', '/influxdb3/core/'); cy.get('h1').should('contain', 'InfluxDB 3 Core'); }); - it('should show Enterprise-specific content', function () { + it('should map Enterprise pages correctly', function () { cy.visit('/influxdb3/enterprise/'); - cy.get('body').should('be.visible'); cy.url().should('include', '/influxdb3/enterprise/'); cy.get('h1').should('contain', 'InfluxDB 3 Enterprise'); }); + + it('should map Cloud Serverless pages correctly', function () { + cy.visit('/influxdb3/cloud-serverless/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb3/cloud-serverless/'); + cy.get('h1').should('contain', 'InfluxDB Cloud Serverless'); + }); + + it('should map Cloud Dedicated pages correctly', function () { + cy.visit('/influxdb3/cloud-dedicated/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb3/cloud-dedicated/'); + cy.get('h1').should('contain', 'InfluxDB Cloud Dedicated'); + }); + + it('should map Clustered pages correctly', function () { + cy.visit('/influxdb3/clustered/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb3/clustered/'); + cy.get('h1').should('contain', 'InfluxDB Clustered'); + }); }); - describe('Product Data Validation', function () { - it('should have correct Explorer product configuration', function () { + describe('InfluxDB v2 and Cloud Products', function () { + it('should map InfluxDB v2 pages correctly', function () { + cy.visit('/influxdb/v2/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb/v2/'); + cy.get('h1').should('contain', 'InfluxDB v2'); + }); + + it('should map InfluxDB Cloud (TSM) pages correctly', function () { + cy.visit('/influxdb/cloud/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb/cloud/'); + cy.get('h1').should('contain', 'InfluxDB Cloud'); + }); + }); + + describe('InfluxDB v1 Products', function () { + it('should map InfluxDB v1 pages correctly', function () { + cy.visit('/influxdb/v1/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/influxdb/v1/'); + cy.get('h1').should('contain', 'InfluxDB OSS'); + }); + + it('should map Enterprise v1 pages correctly', function () { + cy.visit('/enterprise_influxdb/v1/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/enterprise_influxdb/v1/'); + cy.get('h1').should('contain', 'InfluxDB Enterprise'); + }); + }); + + describe('Other Products', function () { + it('should map Telegraf pages correctly', function () { + cy.visit('/telegraf/v1/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/telegraf/v1/'); + cy.get('h1').should('contain', 'Telegraf'); + }); + + it('should map Chronograf pages correctly', function () { + cy.visit('/chronograf/v1/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/chronograf/v1/'); + cy.get('h1').should('contain', 'Chronograf'); + }); + + it('should map Kapacitor pages correctly', function () { + cy.visit('/kapacitor/v1/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/kapacitor/v1/'); + cy.get('h1').should('contain', 'Kapacitor'); + }); + + it('should map Flux pages correctly', function () { + cy.visit('/flux/v0/'); + cy.get('body').should('be.visible'); + cy.url().should('include', '/flux/v0/'); + cy.get('h1').should('contain', 'Flux'); + }); + }); +}); + +describe('Product Data Validation - AI Questions', function () { + describe('InfluxDB 3 Products', function () { + it('should have correct Explorer AI configuration', function () { cy.task('getData', 'products').then((products) => { - // Verify Explorer product exists in products.yml expect(products.influxdb3_explorer).to.exist; expect(products.influxdb3_explorer.name).to.equal( 'InfluxDB 3 Explorer' ); - expect(products.influxdb3_explorer.namespace).to.equal( - 'influxdb3_explorer' - ); - expect(products.influxdb3_explorer.placeholder_host).to.equal( - 'localhost:8888' - ); - - // Verify AI configuration expect(products.influxdb3_explorer.ai_sample_questions).to.exist; expect(products.influxdb3_explorer.ai_sample_questions).to.be.an( 'array' ); - expect( - products.influxdb3_explorer.ai_sample_questions.length - ).to.be.greaterThan(0); - // Verify Explorer-specific questions const questionsText = products.influxdb3_explorer.ai_sample_questions.join(' '); expect(questionsText).to.include('install and run'); expect(questionsText).to.include('query data'); expect(questionsText).to.include('visualize data'); - - // Verify it doesn't have Core/Enterprise specific questions expect(questionsText).to.not.include('plugin'); expect(questionsText).to.not.include('read replica'); }); }); - it('should have correct Core product configuration', function () { + it('should have correct Core AI configuration', function () { cy.task('getData', 'products').then((products) => { expect(products.influxdb3_core).to.exist; expect(products.influxdb3_core.name).to.equal('InfluxDB 3 Core'); - expect(products.influxdb3_core.placeholder_host).to.equal( - 'localhost:8181' - ); + expect(products.influxdb3_core.ai_sample_questions).to.exist; const questionsText = products.influxdb3_core.ai_sample_questions.join(' '); expect(questionsText).to.include('install and run'); expect(questionsText).to.include('plugin'); + expect(questionsText).to.not.include('read replica'); }); }); - it('should have correct Enterprise product configuration', function () { + it('should have correct Enterprise AI configuration', function () { cy.task('getData', 'products').then((products) => { expect(products.influxdb3_enterprise).to.exist; expect(products.influxdb3_enterprise.name).to.equal( 'InfluxDB 3 Enterprise' ); - expect(products.influxdb3_enterprise.placeholder_host).to.equal( - 'localhost:8181' - ); + expect(products.influxdb3_enterprise.ai_sample_questions).to.exist; const questionsText = products.influxdb3_enterprise.ai_sample_questions.join(' '); @@ -106,5 +164,150 @@ describe('Page Context - Ask AI Integration', function () { expect(questionsText).to.include('read replica'); }); }); + + it('should have correct Cloud Serverless AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb3_cloud_serverless).to.exist; + expect(products.influxdb3_cloud_serverless.name).to.equal( + 'InfluxDB Cloud Serverless' + ); + expect( + products.influxdb3_cloud_serverless.ai_sample_questions + ).to.exist; + + const questionsText = + products.influxdb3_cloud_serverless.ai_sample_questions.join(' '); + expect(questionsText).to.include('migrate from Cloud'); + expect(questionsText).to.include('write data'); + }); + }); + + it('should have correct Cloud Dedicated AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb3_cloud_dedicated).to.exist; + expect(products.influxdb3_cloud_dedicated.name).to.equal( + 'InfluxDB Cloud Dedicated' + ); + expect(products.influxdb3_cloud_dedicated.ai_sample_questions).to.exist; + + const questionsText = + products.influxdb3_cloud_dedicated.ai_sample_questions.join(' '); + expect(questionsText).to.include('migrate from v1'); + expect(questionsText).to.include('SQL'); + }); + }); + + it('should have correct Clustered AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb3_clustered).to.exist; + expect(products.influxdb3_clustered.name).to.equal( + 'InfluxDB Clustered' + ); + expect(products.influxdb3_clustered.ai_sample_questions).to.exist; + + const questionsText = + products.influxdb3_clustered.ai_sample_questions.join(' '); + expect(questionsText).to.include('Helm chart'); + expect(questionsText).to.include('SQL'); + }); + }); + }); + + describe('InfluxDB v2 and Cloud Products', function () { + it('should have correct InfluxDB v2 AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb).to.exist; + expect(products.influxdb.name).to.equal('InfluxDB'); + expect(products.influxdb.ai_sample_questions).to.exist; + + const questionsText = products.influxdb.ai_sample_questions.join(' '); + expect(questionsText).to.include('write and query data'); + expect(questionsText).to.include('migrate to InfluxDB 3'); + expect(questionsText).to.include('auth tokens'); + }); + }); + + it('should have correct Cloud (TSM) AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.influxdb_cloud).to.exist; + expect(products.influxdb_cloud.name).to.equal('InfluxDB Cloud (TSM)'); + expect(products.influxdb_cloud.ai_sample_questions).to.exist; + + const questionsText = + products.influxdb_cloud.ai_sample_questions.join(' '); + expect(questionsText).to.include('write and query data'); + expect(questionsText).to.include('Cloud (TSM)'); + }); + }); + }); + + describe('InfluxDB v1 Products', function () { + it('should have correct Enterprise v1 AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.enterprise_influxdb).to.exist; + expect(products.enterprise_influxdb.name).to.equal( + 'InfluxDB Enterprise v1' + ); + expect(products.enterprise_influxdb.ai_sample_questions).to.exist; + + const questionsText = + products.enterprise_influxdb.ai_sample_questions.join(' '); + expect(questionsText).to.include('configure the server'); + expect(questionsText).to.include('replicate data'); + expect(questionsText).to.include('query data'); + }); + }); + }); + + describe('Other Products', function () { + it('should have correct Telegraf AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.telegraf).to.exist; + expect(products.telegraf.name).to.equal('Telegraf'); + expect(products.telegraf.ai_sample_questions).to.exist; + + const questionsText = products.telegraf.ai_sample_questions.join(' '); + expect(questionsText).to.include('configure Telegraf'); + expect(questionsText).to.include('custom'); + expect(questionsText).to.include('MQTT'); + }); + }); + + it('should have correct Chronograf AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.chronograf).to.exist; + expect(products.chronograf.name).to.equal('Chronograf'); + expect(products.chronograf.ai_sample_questions).to.exist; + + const questionsText = products.chronograf.ai_sample_questions.join(' '); + expect(questionsText).to.include('configure Chronograf'); + expect(questionsText).to.include('dashboard'); + }); + }); + + it('should have correct Kapacitor AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.kapacitor).to.exist; + expect(products.kapacitor.name).to.equal('Kapacitor'); + expect(products.kapacitor.ai_sample_questions).to.exist; + + const questionsText = products.kapacitor.ai_sample_questions.join(' '); + expect(questionsText).to.include('configure Kapacitor'); + expect(questionsText).to.include('custom task'); + }); + }); + + it('should have correct Flux AI configuration', function () { + cy.task('getData', 'products').then((products) => { + expect(products.flux).to.exist; + expect(products.flux.name).to.equal('Flux'); + expect(products.flux.ai_sample_questions).to.exist; + + const questionsText = products.flux.ai_sample_questions.join(' '); + expect(questionsText).to.include('query with Flux'); + expect(questionsText).to.include('transform data'); + expect(questionsText).to.include('join data'); + }); + }); }); }); From c2a49b113409ff59a1877ffb68c74191f384a585 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 12:43:57 -0600 Subject: [PATCH 12/15] fix(page-context): correct enterprise_influxdb URL pattern matching - Changed pattern from /enterprise_v1/ to /enterprise_influxdb/ - Fixes Ask AI example questions not showing correctly for Enterprise v1 - Pattern now matches actual URL structure /enterprise_influxdb/v1/ - All 27 e2e tests passing --- assets/js/page-context.js | 2 +- cypress/e2e/page-context.cy.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/assets/js/page-context.js b/assets/js/page-context.js index 5566f2f04b..695f731942 100644 --- a/assets/js/page-context.js +++ b/assets/js/page-context.js @@ -43,7 +43,7 @@ function getCurrentProductData() { urls: influxdbUrls.core, }, { - pattern: /\/enterprise_v1\//, + pattern: /\/enterprise_influxdb\//, product: products.enterprise_influxdb, urls: influxdbUrls.oss, }, diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js index 52c9460171..87567afea5 100644 --- a/cypress/e2e/page-context.cy.js +++ b/cypress/e2e/page-context.cy.js @@ -171,9 +171,8 @@ describe('Product Data Validation - AI Questions', function () { expect(products.influxdb3_cloud_serverless.name).to.equal( 'InfluxDB Cloud Serverless' ); - expect( - products.influxdb3_cloud_serverless.ai_sample_questions - ).to.exist; + expect(products.influxdb3_cloud_serverless.ai_sample_questions).to + .exist; const questionsText = products.influxdb3_cloud_serverless.ai_sample_questions.join(' '); From d675e828ef85fb80920ce86a0efa8df9e57d2e1f Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 13:26:31 -0600 Subject: [PATCH 13/15] test(page-context): add UI validation for Ask AI widget configuration - Added 4 tests checking Kapa widget script data attributes - Tests verify data-modal-example-questions contains correct product-specific questions - Validates Explorer, Core, Enterprise, and Enterprise v1 configurations - All 31 tests passing (27 existing + 4 new UI tests) --- cypress/e2e/page-context.cy.js | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js index 87567afea5..620c94965a 100644 --- a/cypress/e2e/page-context.cy.js +++ b/cypress/e2e/page-context.cy.js @@ -113,6 +113,60 @@ describe('Page Context - Product Mapping', function () { }); }); +describe('Ask AI Widget Configuration', function () { + describe('InfluxDB 3 Products', function () { + it('should configure Explorer-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/explorer/'); + + // Check the Kapa widget script tag has correct data-modal-example-questions attribute + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('install and run Explorer'); + expect(questions).to.include('query data using Explorer'); + expect(questions).to.include('visualize data using Explorer'); + // Should NOT have Core/Enterprise specific questions + expect(questions).to.not.include('plugin'); + expect(questions).to.not.include('read replica'); + }); + }); + + it('should configure Core-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/core/'); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('install and run'); + expect(questions).to.include('plugin for the Python Processing engine'); + // Should NOT have read replica question + expect(questions).to.not.include('read replica'); + }); + }); + + it('should configure Enterprise-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/enterprise/'); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('install and run'); + expect(questions).to.include('read replica node'); + }); + }); + }); + + describe('InfluxDB v1 Products', function () { + it('should configure Enterprise v1-specific questions in Kapa widget', function () { + cy.visit('/enterprise_influxdb/v1/'); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('configure the server'); + expect(questions).to.include('replicate data from OSS'); + expect(questions).to.include('query data'); + }); + }); + }); +}); + describe('Product Data Validation - AI Questions', function () { describe('InfluxDB 3 Products', function () { it('should have correct Explorer AI configuration', function () { From 3289052216e210247e4c808f54d1ea738704770c Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 12 Nov 2025 15:23:14 -0600 Subject: [PATCH 14/15] feat(ask-ai): add help in Ask AI widget placeholder - InfluxDB placeholder recommends specifying product and version - Fix page-context.js to use products.influxdb_cloud instead of products.cloud - Add UI tests verifying version-specific naming in Kapa widget script tags --- .github/instructions/layouts.instructions.md | 34 +- assets/js/ask-ai-trigger.js | 104 +- assets/js/ask-ai.ts | 104 +- assets/js/page-context.js | 2 +- .../v1/administration/identify-version.md | 21 + content/example.md | 1455 +++++++++-------- .../influxdb/cloud/admin/identify-version.md | 22 + .../v1/administration/identify-version.md | 21 + content/influxdb/v2/admin/identify-version.md | 23 + .../cloud-dedicated/admin/identify-version.md | 22 + .../admin/identify-version.md | 22 + .../clustered/admin/identify-version.md | 23 + .../influxdb3/core/admin/identify-version.md | 23 + content/influxdb3/enterprise/_index.md | 2 +- .../enterprise/admin/identify-version.md | 23 + .../enterprise/get-started/_index.md | 2 +- content/platform/_index.md | 43 +- content/platform/identify-version.md | 10 + content/shared/identify-version.md | 432 +++++ .../influxdb-v2/query-data/influxql/_index.md | 35 +- cypress/e2e/content/ask-ai.cy.js | 403 +++++ cypress/e2e/page-context.cy.js | 252 --- data/products.yml | 68 +- layouts/partials/article.html | 2 +- layouts/partials/article/prepend.html | 11 +- layouts/shortcodes/ask-ai-link.html | 17 + .../shortcodes/influxdb-version-detector.html | 2 +- 27 files changed, 2110 insertions(+), 1068 deletions(-) create mode 100644 content/enterprise_influxdb/v1/administration/identify-version.md create mode 100644 content/influxdb/cloud/admin/identify-version.md create mode 100644 content/influxdb/v1/administration/identify-version.md create mode 100644 content/influxdb/v2/admin/identify-version.md create mode 100644 content/influxdb3/cloud-dedicated/admin/identify-version.md create mode 100644 content/influxdb3/cloud-serverless/admin/identify-version.md create mode 100644 content/influxdb3/clustered/admin/identify-version.md create mode 100644 content/influxdb3/core/admin/identify-version.md create mode 100644 content/influxdb3/enterprise/admin/identify-version.md create mode 100644 content/platform/identify-version.md create mode 100644 content/shared/identify-version.md create mode 100644 cypress/e2e/content/ask-ai.cy.js create mode 100644 layouts/shortcodes/ask-ai-link.html diff --git a/.github/instructions/layouts.instructions.md b/.github/instructions/layouts.instructions.md index dc5d85e936..b9a1e93823 100644 --- a/.github/instructions/layouts.instructions.md +++ b/.github/instructions/layouts.instructions.md @@ -11,10 +11,11 @@ applyTo: "layouts/**/*.html" When creating or modifying Hugo layouts and shortcodes: -1. Use Hugo template syntax and functions -2. Follow existing patterns in `/layouts/shortcodes/` -3. Test in [content/example.md](../../content/example.md) -4. Document new shortcodes in [DOCS-SHORTCODES.md](../../DOCS-SHORTCODES.md) +1. Use test-driven development using `/cypress/` +2. Use Hugo template syntax and functions +3. Follow existing patterns in `/layouts/shortcodes/` +4. Test in [content/example.md](../../content/example.md) +5. Document new shortcodes in [DOCS-SHORTCODES.md](../../DOCS-SHORTCODES.md) ## Shortcode Pattern @@ -30,9 +31,32 @@ When creating or modifying Hugo layouts and shortcodes: ## Testing -Add usage examples to `content/example.md` to verify: +**IMPORTANT:** Use test-driven development with Cypress. + +Add shortcode usage examples to `content/example.md` to verify: + - Rendering in browser - Hugo build succeeds - No console errors +- JavaScript functionality works as expected (check browser console for errors) +- Interactive elements behave correctly (click links, buttons, etc.) + +### TDD Workflow + +1. Add Cypress tests (high-level to start). +2. Run tests and make sure they fail. +3. Implement code changes +4. Run tests and make sure they pass. +5. Add and refine tests. +6. Repeat. + +### Manual Testing Workflow + +1. Make changes to shortcode/layout files +2. Wait for Hugo to rebuild (check terminal output) +3. Get the server URL from the log +4. Open browser DevTools console (F12) +5. Test the functionality and check for JavaScript errors +6. Verify the feature works as intended before marking complete See [DOCS-SHORTCODES.md](../../DOCS-SHORTCODES.md) for complete shortcode documentation. diff --git a/assets/js/ask-ai-trigger.js b/assets/js/ask-ai-trigger.js index 406a6d7277..7b05b4190c 100644 --- a/assets/js/ask-ai-trigger.js +++ b/assets/js/ask-ai-trigger.js @@ -1,19 +1,117 @@ import AskAI from './ask-ai.js'; +/** + * Global state for Ask AI initialization + */ +const state = { + kapaInitialized: false, + linksListenerInitialized: false, +}; + +/** + * Initialize the Kapa widget + */ +function initializeKapa() { + if (!state.kapaInitialized) { + AskAI(); + state.kapaInitialized = true; + + // Store in global namespace for debugging + window.influxdatadocs = window.influxdatadocs || {}; + window.influxdatadocs.kapaInitialized = true; + } +} + +/** + * Show the trigger button by removing inline display: none style + * @param {HTMLElement} element - The trigger button element + */ function showTrigger(element) { - // Remove the inline display: none style - element.removeAttribute('style'); + if (element) { + element.removeAttribute('style'); + } } +/** + * Initialize Ask AI trigger button component + * @param {Object} options - Component options + * @param {HTMLElement} options.component - The trigger button element + */ export default function AskAITrigger({ component }) { const kapaContainer = document.querySelector('#kapa-widget-container'); + if (!component && !kapaContainer) { return; } + if (!kapaContainer) { // Initialize the chat widget AskAI({ onChatLoad: () => showTrigger(component) }); + state.kapaInitialized = true; + window.influxdatadocs = window.influxdatadocs || {}; + window.influxdatadocs.kapaInitialized = true; } else { showTrigger(component); } -} \ No newline at end of file +} + +/** + * Handle ask-ai-link clicks globally + * This ensures ask-ai-link shortcodes work even without the trigger button + */ +function handleAskAILinks() { + if (state.linksListenerInitialized) { + return; + } + + state.linksListenerInitialized = true; + + // Store in global namespace for debugging + window.influxdatadocs = window.influxdatadocs || {}; + window.influxdatadocs.askAILinksInitialized = true; + + // Listen for clicks on ask-ai-link elements + document.addEventListener( + 'click', + (event) => { + const link = event.target.closest('.ask-ai-open'); + if (!link) return; + + const query = link.getAttribute('data-query'); + + // Initialize Kapa if not already done + if (!state.kapaInitialized) { + initializeKapa(); + + // Wait for Kapa to be ready, then open with query + if (query && window.Kapa?.open) { + // Give Kapa a moment to initialize + setTimeout(() => { + if (window.Kapa?.open) { + window.Kapa.open({ + mode: 'ai', + query: query, + }); + } + }, 100); + } + } else { + // Kapa is already initialized - open with query if provided + if (query && window.Kapa?.open) { + window.Kapa.open({ + mode: 'ai', + query: query, + }); + } + } + }, + { passive: true } + ); +} + +// Initialize ask-ai-link handling when DOM is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', handleAskAILinks); +} else { + handleAskAILinks(); +} diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts index edf3d72169..0241b09425 100644 --- a/assets/js/ask-ai.ts +++ b/assets/js/ask-ai.ts @@ -47,6 +47,8 @@ type KapaFunction = (command: string, options?: unknown) => void; interface ChatAttributes extends Record { modalExampleQuestions?: string; + modalAskAiInputPlaceholder?: string; + modalDisclaimer?: string; sourceGroupIdsInclude?: string; } @@ -96,6 +98,7 @@ function initializeChat({ const optionalAttributes = { modalDisclaimer: + chatAttributes.modalDisclaimer || 'This AI can access [documentation for InfluxDB, clients, and related tools](https://docs.influxdata.com). Information you submit is used in accordance with our [Privacy Policy](https://www.influxdata.com/legal/privacy-policy/).', modalExampleQuestions: 'Use Python to write data to InfluxDB 3,How do I query using SQL?,How do I use MQTT with Telegraf?', @@ -175,27 +178,7 @@ function getProductExampleQuestions(): string { return ''; } - // Only add version hints for InfluxDB database products - // Other tools like Explorer, Telegraf, Chronograf, Kapacitor, - // Flux don't need version hints - const productNamespace = productData?.product?.namespace; - const shouldAddVersionHint = - productNamespace === 'influxdb' || - productNamespace === 'influxdb3' || - productNamespace === 'enterprise_influxdb'; - - if (!shouldAddVersionHint) { - return questions.join(','); - } - - const productName = productData?.product?.name || 'InfluxDB'; - - // Append version hint to each question - const questionsWithHint = questions.map((question) => { - return `${question} My version: ${productName}`; - }); - - return questionsWithHint.join(','); + return questions.join(','); } function getProductSourceGroupIds(): string { @@ -205,60 +188,37 @@ function getProductSourceGroupIds(): string { return sourceGroupIds || ''; } -function getVersionContext(): string { - // Only add version context for InfluxDB database products - const productNamespace = productData?.product?.namespace; - const shouldAddVersionContext = - productNamespace === 'influxdb' || - productNamespace === 'influxdb3' || - productNamespace === 'enterprise_influxdb'; - - if (!shouldAddVersionContext) { - return ''; - } - - const productName = productData?.product?.name || 'InfluxDB'; +function getProductInputPlaceholder(): string { + const placeholder = getVersionSpecificConfig('ai_input_placeholder') as + | string + | undefined; - return `My version: ${productName}`; + // Return product-specific placeholder or default + return ( + placeholder || + 'Ask questions about InfluxDB. Specify your product and version ' + + 'for better results' + ); } -function setupVersionPrefill(): void { - const versionContext = getVersionContext(); - if (!versionContext) { - return; - } - - // Wait for Kapa to be available - const checkKapa = (): void => { - if (!window.Kapa || typeof window.Kapa !== 'function') { - setTimeout(checkKapa, 100); - return; - } +function getProductDisclaimer(): string { + // Build version-specific note if version is available + const versionNote = + version && version !== 'n/a' && productData?.product?.name + ? `**Viewing documentation for ${productData.product.name}**\n\n` + : ''; - // Find the Ask AI button and add click handler to prefill version - const askAIButton = document.querySelector('.ask-ai-open'); - if (askAIButton) { - askAIButton.addEventListener( - 'click', - (e) => { - e.preventDefault(); - e.stopPropagation(); - window.Kapa('open', { query: versionContext }); - }, - true - ); // Use capture phase to run before Kapa's handler - } + // Check for product-specific custom disclaimer note + const customNote = getVersionSpecificConfig('ai_disclaimer_note') as + | string + | undefined; + const noteContent = customNote ? `${customNote}\n\n` : ''; - // Listen for conversation reset to re-fill version context - window.Kapa('onAskAIConversationReset', () => { - // Small delay to ensure the reset is complete - setTimeout(() => { - window.Kapa('open', { query: versionContext }); - }, 100); - }); - }; + // Base disclaimer with privacy policy link + const baseDisclaimer = + 'This AI can access [documentation for InfluxDB, clients, and related tools](https://docs.influxdata.com). Information you submit is used in accordance with our [Privacy Policy](https://www.influxdata.com/legal/privacy-policy/).'; - checkKapa(); + return `${versionNote}${noteContent}${baseDisclaimer}`; } /** @@ -277,16 +237,18 @@ export default function AskAI({ ...chatParams }: AskAIParams): void { const modalExampleQuestions = getProductExampleQuestions(); + const modalAskAiInputPlaceholder = getProductInputPlaceholder(); + const modalDisclaimer = getProductDisclaimer(); const sourceGroupIds = getProductSourceGroupIds(); const chatAttributes: ChatAttributes = { ...(modalExampleQuestions && { modalExampleQuestions }), + ...(modalAskAiInputPlaceholder && { modalAskAiInputPlaceholder }), + ...(modalDisclaimer && { modalDisclaimer }), ...(sourceGroupIds && { sourceGroupIdsInclude: sourceGroupIds }), ...(chatParams as Record), }; const wrappedOnChatLoad = (): void => { - // Setup version pre-fill after widget loads - setupVersionPrefill(); // Call original onChatLoad if provided if (onChatLoad) { onChatLoad(); diff --git a/assets/js/page-context.js b/assets/js/page-context.js index 695f731942..f8e816c932 100644 --- a/assets/js/page-context.js +++ b/assets/js/page-context.js @@ -9,7 +9,7 @@ function getCurrentProductData() { const mappings = [ { pattern: /\/influxdb\/cloud\//, - product: products.cloud, + product: products.influxdb_cloud, urls: influxdbUrls.influxdb_cloud, }, { diff --git a/content/enterprise_influxdb/v1/administration/identify-version.md b/content/enterprise_influxdb/v1/administration/identify-version.md new file mode 100644 index 0000000000..facbcf2387 --- /dev/null +++ b/content/enterprise_influxdb/v1/administration/identify-version.md @@ -0,0 +1,21 @@ +--- +title: Identify InfluxDB Enterprise v1 version +description: Learn how to identify your InfluxDB Enterprise v1 version using command-line tools, HTTP endpoints, and other methods. +menu: + enterprise_influxdb_v1: + name: Identify version + parent: Administration +weight: 10 +source: /shared/identify-version.md +related: + - /enterprise_influxdb/v1/install-and-deploy/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ +--- diff --git a/content/example.md b/content/example.md index 44800941f7..4682bf6faf 100644 --- a/content/example.md +++ b/content/example.md @@ -15,7 +15,7 @@ This is a paragraph. Lorem ipsum dolor ({{< icon "trash" "v2" >}}) sit amet, con [foo]: https://docs.influxdata.com -This is **bold** text. This is _italic_ text. This is _**bold and italic**_. +This is **bold** text. This is *italic* text. This is ***bold and italic***. ### Clockface v2 icons @@ -29,68 +29,68 @@ This is **bold** text. This is _italic_ text. This is _**bold and italic**_. {{< nav-icon "settings" "v2" >}} {{< nav-icon "notebooks" "v2" >}} -{{< icon "add-cell" "v2" >}} add-cell -{{< icon "add-label" "v2" >}} add-label -{{< icon "alert" "v2" >}} alert -{{< icon "calendar" "v2" >}} calendar -{{< icon "chat" "v2" >}} chat -{{< icon "checkmark" "v2" >}} checkmark -{{< icon "clone" "v2" >}} clone -{{< icon "cloud" "v2" >}} cloud -{{< icon "cog" "v2" >}} cog -{{< icon "config" "v2" >}} config -{{< icon "copy" "v2" >}} copy -{{< icon "crown" "v2" >}} crown -{{< icon "dashboard" "v2" >}} dashboard -{{< icon "dashboards" "v2" >}} dashboards -{{< icon "data-explorer" "v2" >}} data-explorer -{{< icon "delete" "v2" >}} delete -{{< icon "download" "v2" >}} download -{{< icon "duplicate" "v2" >}} duplicate -{{< icon "edit" "v2" >}} edit -{{< icon "expand" "v2" >}} expand -{{< icon "export" "v2" >}} export -{{< icon "eye" "v2" >}} eye -{{< icon "eye-closed" "v2" >}} eye-closed -{{< icon "eye-open" "v2" >}} eye-open -{{< icon "feedback" "v2" >}} feedback -{{< icon "fullscreen" "v2" >}} fullscreen -{{< icon "gear" "v2" >}} gear -{{< icon "graph" "v2" >}} graph -{{< icon "hide" "v2" >}} hide -{{< icon "influx" "v2" >}} influx -{{< icon "influx-icon" "v2" >}} influx-icon -{{< icon "nav-admin" "v2" >}} nav-admin -{{< icon "nav-config" "v2" >}} nav-config -{{< icon "nav-configuration" "v2" >}} nav-configuration -{{< icon "nav-dashboards" "v2" >}} nav-dashboards -{{< icon "nav-data-explorer" "v2" >}} nav-data-explorer -{{< icon "nav-organizations" "v2" >}} nav-organizations -{{< icon "nav-orgs" "v2" >}} nav-orgs -{{< icon "nav-tasks" "v2" >}} nav-tasks -{{< icon "note" "v2" >}} note -{{< icon "notebook" "v2" >}} notebook -{{< icon "notebooks" "v2" >}} notebooks -{{< icon "org" "v2" >}} org -{{< icon "orgs" "v2" >}} orgs -{{< icon "pause" "v2" >}} pause -{{< icon "pencil" "v2" >}} pencil -{{< icon "play" "v2" >}} play -{{< icon "plus" "v2" >}} plus -{{< icon "refresh" "v2" >}} refresh -{{< icon "remove" "v2" >}} remove -{{< icon "replay" "v2" >}} replay -{{< icon "save-as" "v2" >}} save-as -{{< icon "search" "v2" >}} search -{{< icon "settings" "v2" >}} settings -{{< icon "tasks" "v2" >}} tasks -{{< icon "toggle" "v2" >}} toggle -{{< icon "trash" "v2" >}} trash -{{< icon "trashcan" "v2" >}} trashcan -{{< icon "triangle" "v2" >}} triangle -{{< icon "view" "v2" >}} view -{{< icon "wrench" "v2" >}} wrench -{{< icon "x" "v2" >}} x +{{< icon "add-cell" "v2" >}} add-cell\ +{{< icon "add-label" "v2" >}} add-label\ +{{< icon "alert" "v2" >}} alert\ +{{< icon "calendar" "v2" >}} calendar\ +{{< icon "chat" "v2" >}} chat\ +{{< icon "checkmark" "v2" >}} checkmark\ +{{< icon "clone" "v2" >}} clone\ +{{< icon "cloud" "v2" >}} cloud\ +{{< icon "cog" "v2" >}} cog\ +{{< icon "config" "v2" >}} config\ +{{< icon "copy" "v2" >}} copy\ +{{< icon "crown" "v2" >}} crown\ +{{< icon "dashboard" "v2" >}} dashboard\ +{{< icon "dashboards" "v2" >}} dashboards\ +{{< icon "data-explorer" "v2" >}} data-explorer\ +{{< icon "delete" "v2" >}} delete\ +{{< icon "download" "v2" >}} download\ +{{< icon "duplicate" "v2" >}} duplicate\ +{{< icon "edit" "v2" >}} edit\ +{{< icon "expand" "v2" >}} expand\ +{{< icon "export" "v2" >}} export\ +{{< icon "eye" "v2" >}} eye\ +{{< icon "eye-closed" "v2" >}} eye-closed\ +{{< icon "eye-open" "v2" >}} eye-open\ +{{< icon "feedback" "v2" >}} feedback\ +{{< icon "fullscreen" "v2" >}} fullscreen\ +{{< icon "gear" "v2" >}} gear\ +{{< icon "graph" "v2" >}} graph\ +{{< icon "hide" "v2" >}} hide\ +{{< icon "influx" "v2" >}} influx\ +{{< icon "influx-icon" "v2" >}} influx-icon\ +{{< icon "nav-admin" "v2" >}} nav-admin\ +{{< icon "nav-config" "v2" >}} nav-config\ +{{< icon "nav-configuration" "v2" >}} nav-configuration\ +{{< icon "nav-dashboards" "v2" >}} nav-dashboards\ +{{< icon "nav-data-explorer" "v2" >}} nav-data-explorer\ +{{< icon "nav-organizations" "v2" >}} nav-organizations\ +{{< icon "nav-orgs" "v2" >}} nav-orgs\ +{{< icon "nav-tasks" "v2" >}} nav-tasks\ +{{< icon "note" "v2" >}} note\ +{{< icon "notebook" "v2" >}} notebook\ +{{< icon "notebooks" "v2" >}} notebooks\ +{{< icon "org" "v2" >}} org\ +{{< icon "orgs" "v2" >}} orgs\ +{{< icon "pause" "v2" >}} pause\ +{{< icon "pencil" "v2" >}} pencil\ +{{< icon "play" "v2" >}} play\ +{{< icon "plus" "v2" >}} plus\ +{{< icon "refresh" "v2" >}} refresh\ +{{< icon "remove" "v2" >}} remove\ +{{< icon "replay" "v2" >}} replay\ +{{< icon "save-as" "v2" >}} save-as\ +{{< icon "search" "v2" >}} search\ +{{< icon "settings" "v2" >}} settings\ +{{< icon "tasks" "v2" >}} tasks\ +{{< icon "toggle" "v2" >}} toggle\ +{{< icon "trash" "v2" >}} trash\ +{{< icon "trashcan" "v2" >}} trashcan\ +{{< icon "triangle" "v2" >}} triangle\ +{{< icon "view" "v2" >}} view\ +{{< icon "wrench" "v2" >}} wrench\ +{{< icon "x" "v2" >}} x ### Clockface v3 icons @@ -103,76 +103,76 @@ This is **bold** text. This is _italic_ text. This is _**bold and italic**_. {{< nav-icon "settings" "v3" >}} {{< nav-icon "notebooks" "v3" >}} -{{< icon "add-cell" "v3" >}} add-cell -{{< icon "add-label" "v3" >}} add-label -{{< icon "alert" "v3" >}} alert -{{< icon "annotate" "v3" >}} annotate -{{< icon "bar-chart" "v3" >}} bar-chart -{{< icon "bar-graph" "v3" >}} bar-graph -{{< icon "calendar" "v3" >}} calendar -{{< icon "chat" "v3" >}} chat -{{< icon "checkmark" "v3" >}} checkmark -{{< icon "clock" "v3" >}} clock -{{< icon "clone" "v3" >}} clone -{{< icon "cloud" "v3" >}} cloud -{{< icon "cog" "v3" >}} cog -{{< icon "config" "v3" >}} config -{{< icon "copy" "v3" >}} copy -{{< icon "crown" "v3" >}} crown -{{< icon "dashboard" "v3" >}} dashboard -{{< icon "dashboards" "v3" >}} dashboards -{{< icon "data-explorer" "v3" >}} data-explorer -{{< icon "delete" "v3" >}} delete -{{< icon "download" "v3" >}} download -{{< icon "duplicate" "v3" >}} duplicate -{{< icon "edit" "v3" >}} edit -{{< icon "expand" "v3" >}} expand -{{< icon "export" "v3" >}} export -{{< icon "eye" "v3" >}} eye -{{< icon "eye-closed" "v3" >}} eye-closed -{{< icon "eye-open" "v3" >}} eye-open -{{< icon "feedback" "v3" >}} feedback -{{< icon "fullscreen" "v3" >}} fullscreen -{{< icon "gear" "v3" >}} gear -{{< icon "graph" "v3" >}} graph -{{< icon "handle" "v3" >}} handle -{{< icon "hide" "v3" >}} hide -{{< icon "influx" "v3" >}} influx -{{< icon "influx-icon" "v3" >}} influx-icon -{{< icon "move" "v3" >}} move -{{< icon "move-cell" "v3" >}} move-cell -{{< icon "nav-admin" "v3" >}} nav-admin -{{< icon "nav-config" "v3" >}} nav-config -{{< icon "nav-configuration" "v3" >}} nav-configuration -{{< icon "nav-dashboards" "v3" >}} nav-dashboards -{{< icon "nav-data-explorer" "v3" >}} nav-data-explorer -{{< icon "nav-organizations" "v3" >}} nav-organizations -{{< icon "nav-orgs" "v3" >}} nav-orgs -{{< icon "nav-tasks" "v3" >}} nav-tasks -{{< icon "note" "v3" >}} note -{{< icon "notebook" "v3" >}} notebook -{{< icon "notebooks" "v3" >}} notebooks -{{< icon "org" "v3" >}} org -{{< icon "orgs" "v3" >}} orgs -{{< icon "pause" "v3" >}} pause -{{< icon "pencil" "v3" >}} pencil -{{< icon "pin" "v3" >}} pin -{{< icon "play" "v3" >}} play -{{< icon "plus" "v3" >}} plus -{{< icon "refresh" "v3" >}} refresh -{{< icon "remove" "v3" >}} remove -{{< icon "replay" "v3" >}} replay -{{< icon "save-as" "v3" >}} save-as -{{< icon "search" "v3" >}} search -{{< icon "settings" "v3" >}} settings -{{< icon "tasks" "v3" >}} tasks -{{< icon "toggle" "v3" >}} toggle -{{< icon "trash" "v3" >}} trash -{{< icon "trashcan" "v3" >}} trashcan -{{< icon "triangle" "v3" >}} triangle -{{< icon "view" "v3" >}} view -{{< icon "wrench" "v3" >}} wrench -{{< icon "x" "v3" >}} x +{{< icon "add-cell" "v3" >}} add-cell\ +{{< icon "add-label" "v3" >}} add-label\ +{{< icon "alert" "v3" >}} alert\ +{{< icon "annotate" "v3" >}} annotate\ +{{< icon "bar-chart" "v3" >}} bar-chart\ +{{< icon "bar-graph" "v3" >}} bar-graph\ +{{< icon "calendar" "v3" >}} calendar\ +{{< icon "chat" "v3" >}} chat\ +{{< icon "checkmark" "v3" >}} checkmark\ +{{< icon "clock" "v3" >}} clock\ +{{< icon "clone" "v3" >}} clone\ +{{< icon "cloud" "v3" >}} cloud\ +{{< icon "cog" "v3" >}} cog\ +{{< icon "config" "v3" >}} config\ +{{< icon "copy" "v3" >}} copy\ +{{< icon "crown" "v3" >}} crown\ +{{< icon "dashboard" "v3" >}} dashboard\ +{{< icon "dashboards" "v3" >}} dashboards\ +{{< icon "data-explorer" "v3" >}} data-explorer\ +{{< icon "delete" "v3" >}} delete\ +{{< icon "download" "v3" >}} download\ +{{< icon "duplicate" "v3" >}} duplicate\ +{{< icon "edit" "v3" >}} edit\ +{{< icon "expand" "v3" >}} expand\ +{{< icon "export" "v3" >}} export\ +{{< icon "eye" "v3" >}} eye\ +{{< icon "eye-closed" "v3" >}} eye-closed\ +{{< icon "eye-open" "v3" >}} eye-open\ +{{< icon "feedback" "v3" >}} feedback\ +{{< icon "fullscreen" "v3" >}} fullscreen\ +{{< icon "gear" "v3" >}} gear\ +{{< icon "graph" "v3" >}} graph\ +{{< icon "handle" "v3" >}} handle\ +{{< icon "hide" "v3" >}} hide\ +{{< icon "influx" "v3" >}} influx\ +{{< icon "influx-icon" "v3" >}} influx-icon\ +{{< icon "move" "v3" >}} move\ +{{< icon "move-cell" "v3" >}} move-cell\ +{{< icon "nav-admin" "v3" >}} nav-admin\ +{{< icon "nav-config" "v3" >}} nav-config\ +{{< icon "nav-configuration" "v3" >}} nav-configuration\ +{{< icon "nav-dashboards" "v3" >}} nav-dashboards\ +{{< icon "nav-data-explorer" "v3" >}} nav-data-explorer\ +{{< icon "nav-organizations" "v3" >}} nav-organizations\ +{{< icon "nav-orgs" "v3" >}} nav-orgs\ +{{< icon "nav-tasks" "v3" >}} nav-tasks\ +{{< icon "note" "v3" >}} note\ +{{< icon "notebook" "v3" >}} notebook\ +{{< icon "notebooks" "v3" >}} notebooks\ +{{< icon "org" "v3" >}} org\ +{{< icon "orgs" "v3" >}} orgs\ +{{< icon "pause" "v3" >}} pause\ +{{< icon "pencil" "v3" >}} pencil\ +{{< icon "pin" "v3" >}} pin\ +{{< icon "play" "v3" >}} play\ +{{< icon "plus" "v3" >}} plus\ +{{< icon "refresh" "v3" >}} refresh\ +{{< icon "remove" "v3" >}} remove\ +{{< icon "replay" "v3" >}} replay\ +{{< icon "save-as" "v3" >}} save-as\ +{{< icon "search" "v3" >}} search\ +{{< icon "settings" "v3" >}} settings\ +{{< icon "tasks" "v3" >}} tasks\ +{{< icon "toggle" "v3" >}} toggle\ +{{< icon "trash" "v3" >}} trash\ +{{< icon "trashcan" "v3" >}} trashcan\ +{{< icon "triangle" "v3" >}} triangle\ +{{< icon "view" "v3" >}} view\ +{{< icon "wrench" "v3" >}} wrench\ +{{< icon "x" "v3" >}} x ### Clockface v4 icons @@ -185,72 +185,72 @@ This is **bold** text. This is _italic_ text. This is _**bold and italic**_. {{< nav-icon "settings" >}} {{< nav-icon "notebooks" >}} -{{< icon "add-cell" >}} add-cell -{{< icon "add-label" >}} add-label -{{< icon "alert" >}} alert -{{< icon "annotate" >}} annotate -{{< icon "bar-chart" >}} bar-chart -{{< icon "bar-graph" >}} bar-graph -{{< icon "calendar" >}} calendar -{{< icon "chat" >}} chat -{{< icon "checkmark" >}} checkmark -{{< icon "clock" >}} clock -{{< icon "clone" >}} clone -{{< icon "cloud" >}} cloud -{{< icon "cog" >}} cog -{{< icon "config" >}} config -{{< icon "copy" >}} copy -{{< icon "crown" >}} crown -{{< icon "dashboard" >}} dashboard -{{< icon "dashboards" >}} dashboards -{{< icon "data-explorer" >}} data-explorer -{{< icon "delete" >}} delete -{{< icon "download" >}} download -{{< icon "duplicate" >}} duplicate -{{< icon "edit" >}} edit -{{< icon "expand" >}} expand -{{< icon "export" >}} export -{{< icon "eye" >}} eye -{{< icon "eye-closed" >}} eye-closed -{{< icon "eye-open" >}} eye-open -{{< icon "feedback" >}} feedback -{{< icon "fullscreen" >}} fullscreen -{{< icon "gear" >}} gear -{{< icon "graph" >}} graph -{{< icon "handle" >}} handle -{{< icon "hide" >}} hide -{{< icon "influx" >}} influx -{{< icon "influx-icon" >}} influx-icon -{{< icon "move" >}} move -{{< icon "move-cell" >}} move-cell -{{< icon "nav-admin" >}} nav-admin -{{< icon "nav-dashboards" >}} nav-dashboards -{{< icon "nav-data-explorer" >}} nav-data-explorer -{{< icon "nav-organizations" >}} nav-organizations -{{< icon "nav-orgs" >}} nav-orgs -{{< icon "nav-tasks" >}} nav-tasks -{{< icon "note" >}} note -{{< icon "notebook" >}} notebook -{{< icon "notebooks" >}} notebooks -{{< icon "org" >}} org -{{< icon "orgs" >}} orgs -{{< icon "pause" >}} pause -{{< icon "pencil" >}} pencil -{{< icon "pin" >}} pin -{{< icon "play" >}} play -{{< icon "plus" >}} plus -{{< icon "refresh" >}} refresh -{{< icon "remove" >}} remove -{{< icon "replay" >}} replay -{{< icon "save-as" >}} save-as -{{< icon "search" >}} search -{{< icon "settings" >}} settings -{{< icon "tasks" >}} tasks -{{< icon "toggle" >}} toggle -{{< icon "trash" >}} trash -{{< icon "trashcan" >}} trashcan -{{< icon "view" >}} view -{{< icon "x" >}} x +{{< icon "add-cell" >}} add-cell\ +{{< icon "add-label" >}} add-label\ +{{< icon "alert" >}} alert\ +{{< icon "annotate" >}} annotate\ +{{< icon "bar-chart" >}} bar-chart\ +{{< icon "bar-graph" >}} bar-graph\ +{{< icon "calendar" >}} calendar\ +{{< icon "chat" >}} chat\ +{{< icon "checkmark" >}} checkmark\ +{{< icon "clock" >}} clock\ +{{< icon "clone" >}} clone\ +{{< icon "cloud" >}} cloud\ +{{< icon "cog" >}} cog\ +{{< icon "config" >}} config\ +{{< icon "copy" >}} copy\ +{{< icon "crown" >}} crown\ +{{< icon "dashboard" >}} dashboard\ +{{< icon "dashboards" >}} dashboards\ +{{< icon "data-explorer" >}} data-explorer\ +{{< icon "delete" >}} delete\ +{{< icon "download" >}} download\ +{{< icon "duplicate" >}} duplicate\ +{{< icon "edit" >}} edit\ +{{< icon "expand" >}} expand\ +{{< icon "export" >}} export\ +{{< icon "eye" >}} eye\ +{{< icon "eye-closed" >}} eye-closed\ +{{< icon "eye-open" >}} eye-open\ +{{< icon "feedback" >}} feedback\ +{{< icon "fullscreen" >}} fullscreen\ +{{< icon "gear" >}} gear\ +{{< icon "graph" >}} graph\ +{{< icon "handle" >}} handle\ +{{< icon "hide" >}} hide\ +{{< icon "influx" >}} influx\ +{{< icon "influx-icon" >}} influx-icon\ +{{< icon "move" >}} move\ +{{< icon "move-cell" >}} move-cell\ +{{< icon "nav-admin" >}} nav-admin\ +{{< icon "nav-dashboards" >}} nav-dashboards\ +{{< icon "nav-data-explorer" >}} nav-data-explorer\ +{{< icon "nav-organizations" >}} nav-organizations\ +{{< icon "nav-orgs" >}} nav-orgs\ +{{< icon "nav-tasks" >}} nav-tasks\ +{{< icon "note" >}} note\ +{{< icon "notebook" >}} notebook\ +{{< icon "notebooks" >}} notebooks\ +{{< icon "org" >}} org\ +{{< icon "orgs" >}} orgs\ +{{< icon "pause" >}} pause\ +{{< icon "pencil" >}} pencil\ +{{< icon "pin" >}} pin\ +{{< icon "play" >}} play\ +{{< icon "plus" >}} plus\ +{{< icon "refresh" >}} refresh\ +{{< icon "remove" >}} remove\ +{{< icon "replay" >}} replay\ +{{< icon "save-as" >}} save-as\ +{{< icon "search" >}} search\ +{{< icon "settings" >}} settings\ +{{< icon "tasks" >}} tasks\ +{{< icon "toggle" >}} toggle\ +{{< icon "trash" >}} trash\ +{{< icon "trashcan" >}} trashcan\ +{{< icon "view" >}} view\ +{{< icon "x" >}} x ## h2 This is a header2 @@ -274,6 +274,7 @@ vel tempor odio dolor blandit justo. [InfluxQL](#) {{% /code-tabs %}} {{% code-tab-content %}} + ```js data = from(bucket: "example-bucket") |> range(start: -15m) @@ -282,13 +283,16 @@ data = from(bucket: "example-bucket") r._field == "used_percent" ) ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```sql SELECT "used_percent" FROM "telegraf"."autogen"."mem" WHERE time > now() - 15m ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} @@ -352,28 +356,31 @@ enim risus id est. Etiam tristique nisi et tristique auctor. Morbi eu bibendum erat. Sed ullamcorper, dui id lobortis efficitur, mauris odio pharetra neque, vel tempor odio dolor blandit justo. ---- +*** -There is a horizontal rule above and below this line. +This line has a horizontal rule above and below. ---- +*** #### Inline Styles This is an [inline link](#). This is `inline code`. This is an [`inline code link`](#). This is an [`inline code link` with text in the link](#). -This is **bold**. This is _italic_. +This is **bold**. This is *italic*. - Unordered list line-item 1 + - Unordered list line-item 2 - Unordered list line-item 2.1 - Unordered list line-item 2.2 - - Unordered list line-item 2.3 _(this is just an li, no p tag)_ - 1. Ordered list item nested 1 - 2. Ordered list item nested 2 - 3. Ordered list item nested 3 + - Unordered list line-item 2.3 *(this is just an li, no p tag)* + 1. Ordered list item nested 1 + 2. Ordered list item nested 2 + 3. Ordered list item nested 3 + - Unordered list line-item 3 + - Unordered list line-item with multiple paragraphs. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. @@ -391,212 +398,232 @@ This is **bold**. This is _italic_. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. Etiam tristique nisi et tristique auctor. - -1. Ordered list line-item 1 -2. Ordered list line-item 2 - 1. Ordered list line-item 2.1 - 2. Ordered list line-item 2.2 - 3. Ordered list line-item 2.3 _(this is just an li, no p tag)_ - - Unordered list item nested 1 - - Unordered list item nested 2 - - Unordered list item nested 3 - 4. Ordered list line-item 2.4 with hard return. - - - Unordered list item nested 1 - - Unordered list item nested 2 - - Unordered list item nested 3 - - With Another paragraph. - -3. Ordered list line-item 3 -4. Ordered list line-item with multiple paragraphs. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. - Etiam tristique nisi et tristique auctor. - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. - Etiam tristique nisi et tristique auctor. - -5. Ordered list line-item with multiple paragraphs. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. - Etiam tristique nisi et tristique auctor. - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. - Etiam tristique nisi et tristique auctor. - - ```js - // This is a code block - cpu = from(bucket:"example-bucket") - |> range(start:-30m) - |> filter(fn:(r) => r._measurement == "cpu") - |> filter(fn:(r) => r._measurement == "cpu") |> filter(fn:(r) => r._measurement == "cpu") - - avg_cpu = cpu |> window(every:5m) |> mean() - - avg_cpu - |> group(none:true) - |> yield() - // - ``` - - ###### Here's a codeblock with a title - - ```js - // This is a code block - cpu = from(bucket:"example-bucket") - |> range(start:-30m) - |> filter(fn:(r) => r._measurement == "cpu") - - avg_cpu = cpu |> window(every:5m) |> mean() - - avg_cpu - |> group(none:true) - |> yield() - // - ``` - - --- + +1. Ordered list line-item 1 + +2. Ordered list line-item 2 + 1. Ordered list line-item 2.1 + 2. Ordered list line-item 2.2 + 3. Ordered list line-item 2.3 *(this is just an li, no p tag)* + - Unordered list item nested 1 + - Unordered list item nested 2 + - Unordered list item nested 3 + +3. Ordered list line-item 2.4 with hard return. + + - Unordered list item nested 1 + - Unordered list item nested 2 + - Unordered list item nested 3 + + With Another paragraph. + +4. Ordered list line-item 3 + +5. Ordered list line-item with multiple paragraphs. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. + Etiam tristique nisi et tristique auctor. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. + Etiam tristique nisi et tristique auctor. + +6. Ordered list line-item with multiple paragraphs. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. + Etiam tristique nisi et tristique auctor. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. + Etiam tristique nisi et tristique auctor. + +```js +// This is a code block +cpu = from(bucket:"example-bucket") + |> range(start:-30m) + |> filter(fn:(r) => r._measurement == "cpu") + |> filter(fn:(r) => r._measurement == "cpu") |> filter(fn:(r) => r._measurement == "cpu") + +avg_cpu = cpu |> window(every:5m) |> mean() + +avg_cpu + |> group(none:true) + |> yield() +// +``` + +###### Here's a codeblock with a title + +```js +// This is a code block +cpu = from(bucket:"example-bucket") + |> range(start:-30m) + |> filter(fn:(r) => r._measurement == "cpu") + +avg_cpu = cpu |> window(every:5m) |> mean() + +avg_cpu + |> group(none:true) + |> yield() +// +``` + +*** ## Alert blocks -> [!NOTE] +> \[!NOTE] > This is a **Note**. > Useful information that users should know, even when skimming content. -> [!TIP] +> \[!TIP] > This is a **Tip**. > Helpful advice for doing things better or more easily. -> [!IMPORTANT] +> \[!IMPORTANT] > This is an **Important**. > Key information users need to know to achieve their goal. -> [!WARNING] +> \[!WARNING] > This is a **Warning**. > Urgent info that needs immediate user attention to avoid problems. -> [!CAUTION] +> \[!CAUTION] > This is a **Caution**. > Advises about risks or negative outcomes of certain actions. - --- +*** -> [!Note] +> \[!Note] > This is a basic note. -> [!Note] +> \[!Note] +> > ## h2 This is a header2 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ### h3 This is a header3 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ![Test image](/img/chronograf/1-6-alerts-conditions.png) -> +> > {{< img-hd src="/img/influxdb/2-0-controls-time-range.png" alt="Test Image" />}} -> +> > #### h4 This is a header4 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ##### h5 This is a header5 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ###### h6 This is a header6 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. -> +> > #### Inline Styles +> > This is an [inline link](#). This is `inline code`. > This is an [`inline code link`](#) . -> This is **bold**. This is _italic_. -> +> This is **bold**. This is *italic*. +> > - Unordered list line-item 1 +> > - Unordered list line-item 2 > - Unordered list line-item 2.1 > - Unordered list line-item 2.2 > - Unordered list line-item 2.3 +> > - Unordered list line-item 3 -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 1. Unordered list line-item 1 -> 2. Unordered list line-item 2 -> 1. Unordered list line-item 2.1 -> 2. Unordered list line-item 2.2 -> 3. Unordered list line-item 2.3 -> 3. Unordered list line-item 3 -> 4. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 5. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 1. Unordered list line-item 1 +> +> 2. Unordered list line-item 2 +> 1. Unordered list line-item 2.1 +> 2. Unordered list line-item 2.2 +> 3. Unordered list line-item 2.3 +> +> 3. Unordered list line-item 3 +> +> 4. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 5. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> > {{< code-tabs-wrapper >}} -{{% code-tabs %}} -[tab1](#) -[tab2](#) -{{% /code-tabs %}} -{{% code-tab-content %}} +> {{% code-tabs %}} +> [tab1](#) +> [tab2](#) +> {{% /code-tabs %}} +> {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"example-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu" and r._field == "someReallyLongFieldName") ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"my-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu") ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -> + > ###### This is a table > > | Column 1 | Column 2 | Column 3 | Column 4 | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +> | -------- | --------- | -------- | -------- | -------- | --------- | -------- | -------- | > | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | > | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | > | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | @@ -604,128 +631,145 @@ cpu = from(bucket:"my-bucket") > > ###### This is a table with lots of stuff > -> | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | +> | Column 1 | Column 2 | Column 3 | Column 4 | +> | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | > | Row 1.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 2.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 3.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 4.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ---- +*** -> [!Tip] +> \[!Tip] > This is a basic tip. -> [!Tip] +> \[!Tip] +> > ## h2 This is a header2 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ### h3 This is a header3 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ![Test image](/img/chronograf/1-6-alerts-conditions.png) -> +> > {{< img-hd src="/img/influxdb/2-0-controls-time-range.png" alt="Test Image" />}} -> +> > #### h4 This is a header4 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ##### h5 This is a header5 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ###### h6 This is a header6 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. -> +> > #### Inline Styles +> > This is an [inline link](#). This is `inline code`. > This is an [`inline code link`](#) . -> This is **bold**. This is _italic_. -> +> This is **bold**. This is *italic*. +> > - Unordered list line-item 1 +> > - Unordered list line-item 2 > - Unordered list line-item 2.1 > - Unordered list line-item 2.2 > - Unordered list line-item 2.3 +> > - Unordered list line-item 3 -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 1. Unordered list line-item 1 -> 2. Unordered list line-item 2 -> 1. Unordered list line-item 2.1 -> 2. Unordered list line-item 2.2 -> 3. Unordered list line-item 2.3 -> 3. Unordered list line-item 3 -> 4. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 5. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 1. Unordered list line-item 1 +> +> 2. Unordered list line-item 2 +> 1. Unordered list line-item 2.1 +> 2. Unordered list line-item 2.2 +> 3. Unordered list line-item 2.3 +> +> 3. Unordered list line-item 3 +> +> 4. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 5. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> > {{< code-tabs-wrapper >}} -{{% code-tabs %}} -[tab1](#) -[tab2](#) -{{% /code-tabs %}} -{{% code-tab-content %}} +> {{% code-tabs %}} +> [tab1](#) +> [tab2](#) +> {{% /code-tabs %}} +> {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"example-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu" and r._field == "someReallyLongFieldName") ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"my-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu") ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -> + > ###### This is a table > > | Column 1 | Column 2 | Column 3 | Column 4 | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +> | -------- | --------- | -------- | -------- | -------- | --------- | -------- | -------- | > | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | > | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | > | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | @@ -733,128 +777,145 @@ cpu = from(bucket:"my-bucket") > > ###### This is a table with lots of stuff > -> | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | +> | Column 1 | Column 2 | Column 3 | Column 4 | +> | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | > | Row 1.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 2.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 3.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 4.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ---- +*** -> [!Important] +> \[!Important] > This is a basic important block. -> [!Important] +> \[!Important] +> > ## h2 This is a header2 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ### h3 This is a header3 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ![Test image](/img/chronograf/1-6-alerts-conditions.png) -> +> > {{< img-hd src="/img/influxdb/2-0-controls-time-range.png" alt="Test Image" />}} -> +> > #### h4 This is a header4 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ##### h5 This is a header5 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ###### h6 This is a header6 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. -> +> > #### Inline Styles +> > This is an [inline link](#). This is `inline code`. > This is an [`inline code link`](#) . -> This is **bold**. This is _italic_. -> +> This is **bold**. This is *italic*. +> > - Unordered list line-item 1 +> > - Unordered list line-item 2 > - Unordered list line-item 2.1 > - Unordered list line-item 2.2 > - Unordered list line-item 2.3 +> > - Unordered list line-item 3 -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 1. Unordered list line-item 1 -> 2. Unordered list line-item 2 -> 1. Unordered list line-item 2.1 -> 2. Unordered list line-item 2.2 -> 3. Unordered list line-item 2.3 -> 3. Unordered list line-item 3 -> 4. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 5. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 1. Unordered list line-item 1 +> +> 2. Unordered list line-item 2 +> 1. Unordered list line-item 2.1 +> 2. Unordered list line-item 2.2 +> 3. Unordered list line-item 2.3 +> +> 3. Unordered list line-item 3 +> +> 4. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 5. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> > {{< code-tabs-wrapper >}} -{{% code-tabs %}} -[tab1](#) -[tab2](#) -{{% /code-tabs %}} -{{% code-tab-content %}} +> {{% code-tabs %}} +> [tab1](#) +> [tab2](#) +> {{% /code-tabs %}} +> {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"example-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu" and r._field == "someReallyLongFieldName") ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"my-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu") ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -> + > ###### This is a table > > | Column 1 | Column 2 | Column 3 | Column 4 | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +> | -------- | --------- | -------- | -------- | -------- | --------- | -------- | -------- | > | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | > | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | > | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | @@ -862,130 +923,145 @@ cpu = from(bucket:"my-bucket") > > ###### This is a table with lots of stuff > -> | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | +> | Column 1 | Column 2 | Column 3 | Column 4 | +> | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | > | Row 1.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 2.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 3.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 4.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | +*** - ---- - -> [!Warning] +> \[!Warning] > This is a basic warning. -> [!Warning] +> \[!Warning] +> > ## h2 This is a header2 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ### h3 This is a header3 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ![Test image](/img/chronograf/1-6-alerts-conditions.png) -> +> > {{< img-hd src="/img/influxdb/2-0-controls-time-range.png" alt="Test Image" />}} -> +> > #### h4 This is a header4 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ##### h5 This is a header5 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ###### h6 This is a header6 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. -> +> > #### Inline Styles +> > This is an [inline link](#). This is `inline code`. > This is an [`inline code link`](#) . -> This is **bold**. This is _italic_. -> +> This is **bold**. This is *italic*. +> > - Unordered list line-item 1 +> > - Unordered list line-item 2 > - Unordered list line-item 2.1 > - Unordered list line-item 2.2 > - Unordered list line-item 2.3 +> > - Unordered list line-item 3 -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 1. Unordered list line-item 1 -> 2. Unordered list line-item 2 -> 1. Unordered list line-item 2.1 -> 2. Unordered list line-item 2.2 -> 3. Unordered list line-item 2.3 -> 3. Unordered list line-item 3 -> 4. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 5. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 1. Unordered list line-item 1 +> +> 2. Unordered list line-item 2 +> 1. Unordered list line-item 2.1 +> 2. Unordered list line-item 2.2 +> 3. Unordered list line-item 2.3 +> +> 3. Unordered list line-item 3 +> +> 4. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 5. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> > {{< code-tabs-wrapper >}} -{{% code-tabs %}} -[tab1](#) -[tab2](#) -{{% /code-tabs %}} -{{% code-tab-content %}} +> {{% code-tabs %}} +> [tab1](#) +> [tab2](#) +> {{% /code-tabs %}} +> {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"example-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu" and r._field == "someReallyLongFieldName") ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"my-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu") ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -> + > ###### This is a table > > | Column 1 | Column 2 | Column 3 | Column 4 | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +> | -------- | --------- | -------- | -------- | -------- | --------- | -------- | -------- | > | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | > | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | > | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | @@ -993,128 +1069,145 @@ cpu = from(bucket:"my-bucket") > > ###### This is a table with lots of stuff > -> | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | +> | Column 1 | Column 2 | Column 3 | Column 4 | +> | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | > | Row 1.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 2.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 3.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 4.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 4.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ---- +*** -> [!Caution] +> \[!Caution] > This is a basic caution. -> [!Caution] +> \[!Caution] +> > ## h2 This is a header2 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ### h3 This is a header3 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ![Test image](/img/chronograf/1-6-alerts-conditions.png) -> +> > {{< img-hd src="/img/influxdb/2-0-controls-time-range.png" alt="Test Image" />}} -> +> > #### h4 This is a header4 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ##### h5 This is a header5 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > ###### h6 This is a header6 +> > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > Etiam tristique nisi et tristique auctor. -> +> > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. > > Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. > > Etiam tristique nisi et tristique auctor. -> +> > #### Inline Styles +> > This is an [inline link](#). This is `inline code`. > This is an [`inline code link`](#) . -> This is **bold**. This is _italic_. -> +> This is **bold**. This is *italic*. +> > - Unordered list line-item 1 +> > - Unordered list line-item 2 > - Unordered list line-item 2.1 > - Unordered list line-item 2.2 > - Unordered list line-item 2.3 +> > - Unordered list line-item 3 -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> - Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 1. Unordered list line-item 1 -> 2. Unordered list line-item 2 -> 1. Unordered list line-item 2.1 -> 2. Unordered list line-item 2.2 -> 3. Unordered list line-item 2.3 -> 3. Unordered list line-item 3 -> 4. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> 5. Unordered list line-item with multiple paragraphs. -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. -> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. -> Etiam tristique nisi et tristique auctor. -> +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> - Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 1. Unordered list line-item 1 +> +> 2. Unordered list line-item 2 +> 1. Unordered list line-item 2.1 +> 2. Unordered list line-item 2.2 +> 3. Unordered list line-item 2.3 +> +> 3. Unordered list line-item 3 +> +> 4. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> 5. Unordered list line-item with multiple paragraphs. +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> +> Lorem ipsum dolor sit amet, consectetur adipiscing elit. +> Nunc rutrum, metus id scelerisque euismod, erat ante, ac congue enim risus id est. +> Etiam tristique nisi et tristique auctor. +> > {{< code-tabs-wrapper >}} -{{% code-tabs %}} -[tab1](#) -[tab2](#) -{{% /code-tabs %}} -{{% code-tab-content %}} +> {{% code-tabs %}} +> [tab1](#) +> [tab2](#) +> {{% /code-tabs %}} +> {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"example-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu" and r._field == "someReallyLongFieldName") ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```js // This is a code block inside of a blockquote cpu = from(bucket:"my-bucket") |> range(start:-30m) |> filter(fn:(r) => r._measurement == "cpu") ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -> + > ###### This is a table > > | Column 1 | Column 2 | Column 3 | Column 4 | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | +> | -------- | --------- | -------- | -------- | -------- | --------- | -------- | -------- | > | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | Row 1.1 | `Row 1.2` | Row 1.3 | Row 1.4 | > | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | Row 2.1 | `Row 2.2` | Row 2.3 | Row 2.4 | > | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | Row 3.1 | `Row 3.2` | Row 3.3 | Row 3.4 | @@ -1122,8 +1215,8 @@ cpu = from(bucket:"my-bucket") > > ###### This is a table with lots of stuff > -> | Column 1 | Column 2 | Column 3 | Column 4 | -> | -------- | -------- | -------- | -------- | +> | Column 1 | Column 2 | Column 3 | Column 4 | +> | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | > | Row 1.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 1.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 2.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 2.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | > | Row 3.1Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.2Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.3Lorem ipsum dolor sit amet, consectetur adipiscing elit. | Row 3.4Lorem ipsum dolor sit amet, consectetur adipiscing elit. | @@ -1141,6 +1234,7 @@ cpu = from(bucket:"my-bucket") This is a paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum, metus id scelerisque euismod, erat ante suscipit nibh, ac congue enim risus id est. Etiam tristique nisi et tristique auctor. Morbi eu bibendum erat. Sed ullamcorper, dui id lobortis efficitur, mauris odio pharetra neque, vel tempor odio dolor blandit justo. ## h2 This is a header2 + This is a paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum, metus id scelerisque euismod, erat ante suscipit nibh, ac congue enim risus id est. Etiam tristique nisi et tristique auctor. Morbi eu bibendum erat. Sed ullamcorper, dui id lobortis efficitur, mauris odio pharetra neque, vel tempor odio dolor blandit justo. This is a paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum, metus id scelerisque euismod, erat ante suscipit nibh, ac congue enim risus id est. Etiam tristique nisi et tristique auctor. Morbi eu bibendum erat. Sed ullamcorper, dui id lobortis efficitur, mauris odio pharetra neque, vel tempor odio dolor blandit justo. @@ -1152,6 +1246,7 @@ This is a paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nu {{% /code-tabs %}} {{% code-tab-content %}} + ```js data = from(bucket: "example-bucket") |> range(start: -15m) @@ -1160,13 +1255,16 @@ data = from(bucket: "example-bucket") r._field == "used_percent" ) ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```sql SELECT "used_percent" FROM "telegraf"."autogen"."mem" WHERE time > now() - 15m ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} @@ -1213,33 +1311,33 @@ This is tab 2.4 content. {{< /tabs-wrapper >}} {{% truncate %}} -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. -This is truncated content. +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ +This is truncated content.\ {{% /truncate %}} {{< tabs-wrapper >}} @@ -1275,47 +1373,46 @@ Used to demonstrate Flux group keys {{< tabs-wrapper >}} {{% tabs "small" %}} [Input](#) -[Output](#) -Click to view output +[Output](#) Click to view output {{% /tabs %}} {{% tab-content %}} The following data is output from the last `filter()` and piped forward into `group()`: -> [!Note] +> \[!Note] > `_start` and `_stop` columns have been omitted. -{{% flux/group-key "[_measurement=home, room=Kitchen, _field=hum]" true %}} +{{% flux/group-key "\[\_measurement=home, room=Kitchen, \_field=hum]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Kitchen | hum | 35.9 | -| 2022-01-01T09:00:00Z | home | Kitchen | hum | 36.2 | -| 2022-01-01T10:00:00Z | home | Kitchen | hum | 36.1 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :------ | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Kitchen | hum | 35.9 | +| 2022-01-01T09:00:00Z | home | Kitchen | hum | 36.2 | +| 2022-01-01T10:00:00Z | home | Kitchen | hum | 36.1 | -{{% flux/group-key "[_measurement=home, room=Living Room, _field=hum]" true %}} +{{% flux/group-key "\[\_measurement=home, room=Living Room, \_field=hum]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Living Room | hum | 35.9 | -| 2022-01-01T09:00:00Z | home | Living Room | hum | 35.9 | -| 2022-01-01T10:00:00Z | home | Living Room | hum | 36 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :---------- | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Living Room | hum | 35.9 | +| 2022-01-01T09:00:00Z | home | Living Room | hum | 35.9 | +| 2022-01-01T10:00:00Z | home | Living Room | hum | 36 | -{{% flux/group-key "[_measurement=home, room=Kitchen, _field=temp]" true %}} +{{% flux/group-key "\[\_measurement=home, room=Kitchen, \_field=temp]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Kitchen | temp | 21 | -| 2022-01-01T09:00:00Z | home | Kitchen | temp | 23 | -| 2022-01-01T10:00:00Z | home | Kitchen | temp | 22.7 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :------ | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Kitchen | temp | 21 | +| 2022-01-01T09:00:00Z | home | Kitchen | temp | 23 | +| 2022-01-01T10:00:00Z | home | Kitchen | temp | 22.7 | -{{% flux/group-key "[_measurement=home, room=Living Room, _field=temp]" true %}} +{{% flux/group-key "\[\_measurement=home, room=Living Room, \_field=temp]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Living Room | temp | 21.1 | -| 2022-01-01T09:00:00Z | home | Living Room | temp | 21.4 | -| 2022-01-01T10:00:00Z | home | Living Room | temp | 21.8 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :---------- | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Living Room | temp | 21.1 | +| 2022-01-01T09:00:00Z | home | Living Room | temp | 21.4 | +| 2022-01-01T10:00:00Z | home | Living Room | temp | 21.8 | {{% /tab-content %}} {{% tab-content %}} @@ -1328,34 +1425,34 @@ and all the rows with the `hum` field will be in another. `_start` and `_stop` columns have been omitted. {{% /note %}} -{{% flux/group-key "[_field=hum]" true %}} +{{% flux/group-key "\[\_field=hum]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Kitchen | hum | 35.9 | -| 2022-01-01T09:00:00Z | home | Kitchen | hum | 36.2 | -| 2022-01-01T10:00:00Z | home | Kitchen | hum | 36.1 | -| 2022-01-01T08:00:00Z | home | Living Room | hum | 35.9 | -| 2022-01-01T09:00:00Z | home | Living Room | hum | 35.9 | -| 2022-01-01T10:00:00Z | home | Living Room | hum | 36 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :---------- | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Kitchen | hum | 35.9 | +| 2022-01-01T09:00:00Z | home | Kitchen | hum | 36.2 | +| 2022-01-01T10:00:00Z | home | Kitchen | hum | 36.1 | +| 2022-01-01T08:00:00Z | home | Living Room | hum | 35.9 | +| 2022-01-01T09:00:00Z | home | Living Room | hum | 35.9 | +| 2022-01-01T10:00:00Z | home | Living Room | hum | 36 | -{{% flux/group-key "[_field=temp]" true %}} +{{% flux/group-key "\[\_field=temp]" true %}} -| _time | _measurement | room | _field | _value | -| :------------------- | :----------- | :---------- | :----- | :----- | -| 2022-01-01T08:00:00Z | home | Kitchen | temp | 21 | -| 2022-01-01T09:00:00Z | home | Kitchen | temp | 23 | -| 2022-01-01T10:00:00Z | home | Kitchen | temp | 22.7 | -| 2022-01-01T08:00:00Z | home | Living Room | temp | 21.1 | -| 2022-01-01T09:00:00Z | home | Living Room | temp | 21.4 | -| 2022-01-01T10:00:00Z | home | Living Room | temp | 21.8 | +| \_time | \_measurement | room | \_field | \_value | +| :------------------- | :------------ | :---------- | :------ | :------ | +| 2022-01-01T08:00:00Z | home | Kitchen | temp | 21 | +| 2022-01-01T09:00:00Z | home | Kitchen | temp | 23 | +| 2022-01-01T10:00:00Z | home | Kitchen | temp | 22.7 | +| 2022-01-01T08:00:00Z | home | Living Room | temp | 21.1 | +| 2022-01-01T09:00:00Z | home | Living Room | temp | 21.4 | +| 2022-01-01T10:00:00Z | home | Living Room | temp | 21.8 | {{% /tab-content %}} {{< /tabs-wrapper >}} ## datetime/current-timestamp shortcode -### Default usage +### Default usage {{< datetime/current-timestamp >}} @@ -1367,6 +1464,10 @@ and all the rows with the `hum` field will be in another. {{< datetime/current-timestamp format="YYYY-MM-DD HH:mm:ss" timezone="UTC" >}} -### Format with America/New_York timezone +### Format with America/New\_York timezone + +{{< datetime/current-timestamp format="YYYY-MM-DD HH:mm:ss" timezone="America/New\_York" >}} + +## Ask AI Link -{{< datetime/current-timestamp format="YYYY-MM-DD HH:mm:ss" timezone="America/New_York" >}} +Can't access your InfluxDB instance? {{< ask-ai-link link-text="Ask InfluxData AI" query="What's my InfluxDB version?" >}} for help. diff --git a/content/influxdb/cloud/admin/identify-version.md b/content/influxdb/cloud/admin/identify-version.md new file mode 100644 index 0000000000..b79ba94131 --- /dev/null +++ b/content/influxdb/cloud/admin/identify-version.md @@ -0,0 +1,22 @@ +--- +title: Identify InfluxDB Cloud (TSM) version +description: Learn how to identify your InfluxDB Cloud (TSM) instance through URL patterns, account settings, and HTTP headers. +menu: + influxdb_cloud: + name: Identify version + parent: Administer InfluxDB Cloud +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb/cloud/get-started/ + - /influxdb/cloud/admin/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb/v1/administration/identify-version.md b/content/influxdb/v1/administration/identify-version.md new file mode 100644 index 0000000000..67bd3981ff --- /dev/null +++ b/content/influxdb/v1/administration/identify-version.md @@ -0,0 +1,21 @@ +--- +title: Identify InfluxDB OSS v1 version +description: Learn how to identify your InfluxDB OSS v1 version using command-line tools, HTTP endpoints, and other methods. +menu: + influxdb_v1: + name: Identify version + parent: Administration +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb/v1/introduction/installation/ +alt_links: + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb/v2/admin/identify-version.md b/content/influxdb/v2/admin/identify-version.md new file mode 100644 index 0000000000..e3ee0392a9 --- /dev/null +++ b/content/influxdb/v2/admin/identify-version.md @@ -0,0 +1,23 @@ +--- +title: Identify InfluxDB OSS v2 version +description: Learn how to identify your InfluxDB OSS v2 version using command-line tools, the UI, and HTTP endpoints. +menu: + influxdb_v2: + name: Identify version + parent: Administer InfluxDB +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb/v2/get-started/ + - /influxdb/v2/reference/faq/#administration-1 + - /influxdb/v2/reference/cli/influxd/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/cloud-dedicated/admin/identify-version.md b/content/influxdb3/cloud-dedicated/admin/identify-version.md new file mode 100644 index 0000000000..7be69f14be --- /dev/null +++ b/content/influxdb3/cloud-dedicated/admin/identify-version.md @@ -0,0 +1,22 @@ +--- +title: Identify InfluxDB Cloud Dedicated version +description: Learn how to identify your InfluxDB Cloud Dedicated cluster through URL patterns, account settings, and HTTP headers. +menu: + influxdb3_cloud_dedicated: + name: Identify version + parent: Administer InfluxDB +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb3/cloud-dedicated/get-started/ + - /influxdb3/cloud-dedicated/admin/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/cloud-serverless/admin/identify-version.md b/content/influxdb3/cloud-serverless/admin/identify-version.md new file mode 100644 index 0000000000..2c7e6c562d --- /dev/null +++ b/content/influxdb3/cloud-serverless/admin/identify-version.md @@ -0,0 +1,22 @@ +--- +title: Identify InfluxDB Cloud Serverless version +description: Learn how to identify your InfluxDB Cloud Serverless instance through URL patterns, account settings, and HTTP headers. +menu: + influxdb3_cloud_serverless: + name: Identify version + parent: Administer InfluxDB +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb3/cloud-serverless/get-started/ + - /influxdb3/cloud-serverless/admin/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/clustered/admin/identify-version.md b/content/influxdb3/clustered/admin/identify-version.md new file mode 100644 index 0000000000..85df36448b --- /dev/null +++ b/content/influxdb3/clustered/admin/identify-version.md @@ -0,0 +1,23 @@ +--- +title: Identify InfluxDB Clustered version +description: Learn how to identify your InfluxDB Clustered version using influxctl CLI and other methods. +menu: + influxdb3_clustered: + name: Identify version + parent: Administer InfluxDB Clustered +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb3/clustered/get-started/ + - /influxdb3/clustered/admin/ + - /influxdb3/clustered/reference/cli/influxctl/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/core/admin/identify-version.md b/content/influxdb3/core/admin/identify-version.md new file mode 100644 index 0000000000..4849192311 --- /dev/null +++ b/content/influxdb3/core/admin/identify-version.md @@ -0,0 +1,23 @@ +--- +title: Identify InfluxDB 3 Core version +description: Learn how to identify your InfluxDB 3 Core version using command-line tools, HTTP endpoints, and other methods. +menu: + influxdb3_core: + name: Identify version + parent: Administer InfluxDB +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb3/core/get-started/ + - /influxdb3/core/admin/ + - /influxdb3/core/reference/cli/influxdb3/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + enterprise: /influxdb3/enterprise/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/enterprise/_index.md b/content/influxdb3/enterprise/_index.md index bcf4549282..a270bdb796 100644 --- a/content/influxdb3/enterprise/_index.md +++ b/content/influxdb3/enterprise/_index.md @@ -2,7 +2,7 @@ title: InfluxDB 3 Enterprise documentation description: > InfluxDB 3 Enterprise is a time series database built on InfluxDB 3 Core open source. - It is designed to handle high write and query loads using a diskless architechture + It is designed to handle high write and query loads using a diskless architecture that scales horizontally. Learn how to use and leverage InfluxDB in use cases such as monitoring metrics, IoT data, and events. menu: diff --git a/content/influxdb3/enterprise/admin/identify-version.md b/content/influxdb3/enterprise/admin/identify-version.md new file mode 100644 index 0000000000..e3535dd9bd --- /dev/null +++ b/content/influxdb3/enterprise/admin/identify-version.md @@ -0,0 +1,23 @@ +--- +title: Identify InfluxDB 3 Enterprise version +description: Learn how to identify your InfluxDB 3 Enterprise version using command-line tools, HTTP endpoints, and other methods. +menu: + influxdb3_enterprise: + name: Identify version + parent: Administer InfluxDB +weight: 10 +source: /shared/identify-version.md +related: + - /influxdb3/enterprise/get-started/ + - /influxdb3/enterprise/admin/ + - /influxdb3/enterprise/reference/cli/influxdb3/ +alt_links: + v1: /influxdb/v1/administration/identify-version/ + v2: /influxdb/v2/admin/identify-version/ + cloud: /influxdb/cloud/admin/identify-version/ + cloud-serverless: /influxdb3/cloud-serverless/admin/identify-version/ + cloud-dedicated: /influxdb3/cloud-dedicated/admin/identify-version/ + clustered: /influxdb3/clustered/admin/identify-version/ + core: /influxdb3/core/admin/identify-version/ + enterprise_influxdb_v1: /enterprise_influxdb/v1/administration/identify-version/ +--- diff --git a/content/influxdb3/enterprise/get-started/_index.md b/content/influxdb3/enterprise/get-started/_index.md index f140950834..a8109dcded 100644 --- a/content/influxdb3/enterprise/get-started/_index.md +++ b/content/influxdb3/enterprise/get-started/_index.md @@ -2,7 +2,7 @@ title: Get started with InfluxDB 3 Enterprise description: > InfluxDB 3 Enterprise is a time series database built on InfluxDB 3 Core open source. - It is designed to handle high write and query loads using a diskless architechture + It is designed to handle high write and query loads using a diskless architecture that scales horizontally. Learn how to use and leverage InfluxDB in use cases such as monitoring metrics, IoT data, and events. menu: diff --git a/content/platform/_index.md b/content/platform/_index.md index 4d988f8067..75d143b2e8 100644 --- a/content/platform/_index.md +++ b/content/platform/_index.md @@ -21,6 +21,21 @@ weight: 1 **InfluxData platform** is the leading modern [time series](/platform/faq/#what-is-time-series-data) platform, built for metrics and events. +> \[!Note] +> +> #### What's my InfluxDB version? +> +> With multiple InfluxDB deployment options available, identifying which one you're using is important for accessing the correct documentation and features. +> +> **[Identify your InfluxDB version](/platform/identify-version/)** using: +> +> - Interactive version detector +> - URL pattern recognition +> - Command-line tools +> - HTTP API headers +> +> Or browse the product lineup below to find yours. + ## InfluxDB 3 **InfluxDB 3** is InfluxDB’s next generation that unlocks series limitations present in the Time Structured Merge Tree (TSM) storage engine and allows infinite series cardinality without any impact on overall database performance. It also brings with it native SQL support and improved InfluxQL performance. @@ -46,7 +61,8 @@ weight: 1 ## InfluxDB 2 -> [!Note] +> \[!Note] +> > #### New InfluxDB Cloud signups use InfluxDB 3 > > New InfluxDB Cloud signups are for [InfluxDB Cloud Serverless, powered by the InfluxDB 3 storage engine](/influxdb3/cloud-serverless/). @@ -55,11 +71,12 @@ weight: 1 The **InfluxDB 2 platform** consolidates InfluxDB, Chronograf, and Kapacitor from the **InfluxData 1.x platform** into a single packaged solution, with added features and flexibility: - - [InfluxDB OSS 2.x](/influxdb/v2/get-started/): open source platform solution in a single binary - - [InfluxDB Cloud](/influxdb/cloud/get-started/) (**commercial offering**): hosted cloud solution - - [Telegraf](#telegraf): collect data +- [InfluxDB OSS 2.x](/influxdb/v2/get-started/): open source platform solution in a single binary +- [InfluxDB Cloud](/influxdb/cloud/get-started/) (**commercial offering**): hosted cloud solution +- [Telegraf](#telegraf): collect data -> [!Note] +> \[!Note] +> > #### Integrate InfluxDB 2.0 applications with InfluxDB Enterprise 1.8+ > > Use [InfluxDB 2.0 API compatibility endpoints](/enterprise_influxdb/v1/tools/api/#influxdb-20-api-compatibility-endpoints) to integrate applications built on InfluxDB 2.0 or InfluxDB Cloud with InfluxDB Enterprise 1.8+: @@ -71,16 +88,16 @@ The **InfluxDB 2 platform** consolidates InfluxDB, Chronograf, and Kapacitor fro The **InfluxData 1.x platform** includes the following open source components ([TICK stack](#influxdata-1-x-tick-stack)): - - [Telegraf](#telegraf): collect data - - [InfluxDB](#influxdb): store data - - [Chronograf](#chronograf): visualize data - - [Kapacitor](#kapacitor): process data and alerts +- [Telegraf](#telegraf): collect data +- [InfluxDB](#influxdb): store data +- [Chronograf](#chronograf): visualize data +- [Kapacitor](#kapacitor): process data and alerts **InfluxData 1.x** also includes the following **commercial offerings**: - - [InfluxDB Enterprise](#influxdb-enterprise) - - [Kapacitor Enterprise](#kapacitor-enterprise) - - [InfluxCloud 1.x](https://help.influxcloud.net) (hosted cloud solution) +- [InfluxDB Enterprise](#influxdb-enterprise) +- [Kapacitor Enterprise](#kapacitor-enterprise) +- [InfluxCloud 1.x](https://help.influxcloud.net) (hosted cloud solution) ## InfluxData 1.x TICK stack @@ -116,7 +133,7 @@ based on user-defined logic, and running ETL jobs. InfluxDB Enterprise and Kapacitor Enterprise provide clustering, access control, and incremental backup functionality for production infrastructures at scale. You'll also receive direct support from the InfluxData support team. -> [!Note] +> \[!Note] > InfluxDB Enterprise and Kapacitor Enterprise are compatible with open source versions of Telegraf and Chronograf. ### InfluxDB Enterprise diff --git a/content/platform/identify-version.md b/content/platform/identify-version.md new file mode 100644 index 0000000000..fd1074697b --- /dev/null +++ b/content/platform/identify-version.md @@ -0,0 +1,10 @@ +--- +title: Identify your InfluxDB version +description: > + Learn how to identify which InfluxDB product and version you're using. +menu: + platform: + name: Identify version +weight: 102 +source: /shared/identify-version.md +--- diff --git a/content/shared/identify-version.md b/content/shared/identify-version.md new file mode 100644 index 0000000000..2a76b35ff0 --- /dev/null +++ b/content/shared/identify-version.md @@ -0,0 +1,432 @@ +Identifying which InfluxDB product and version you're using is essential for accessing the correct documentation, troubleshooting issues, and planning upgrades. + +> \[!Note] +> {{< influxdb-version-detector >}} + +## Quick detection methods + +{{% hide-in "core,enterprise,cloud-serverless,cloud-dedicated,clustered,v2,cloud,v1" %}} + +### By URL pattern + +If you access InfluxDB via a URL, the hostname often indicates which product you're using: + +| URL Pattern | Product | +| ------------------------------------------ | ------------------------- | +| `*.influxdb.io` | InfluxDB Cloud Dedicated | +| `us-east-1-1.aws.cloud2.influxdata.com` | InfluxDB Cloud Serverless | +| `eu-central-1-1.aws.cloud2.influxdata.com` | InfluxDB Cloud Serverless | +| `*.influxcloud.net` | InfluxDB Cloud 1 (legacy) | +| Other `*.cloud2.influxdata.com` regions | InfluxDB Cloud (TSM) | + +### By default port + +Different InfluxDB products use different default ports: + +- **Port 8181**: InfluxDB 3 (Core or Enterprise) +- **Port 8086**: InfluxDB v1 or v2 + +### By HTTP headers + +Check the `/ping` endpoint to examine HTTP response headers: + +```bash +curl -i http://localhost:8086/ping +``` + +The response headers reveal your InfluxDB product: + +| Headers | Product | +| ------------------------------------------------------------- | ---------------------- | +| `x-influxdb-version: ^3.*`
`x-influxdb-build: Core` | InfluxDB 3 Core | +| `x-influxdb-version: ^3.*`
`x-influxdb-build: Enterprise` | InfluxDB 3 Enterprise | +| `x-influxdb-version: ^2.*`
`x-influxdb-build: OSS` | InfluxDB OSS v2 | +| `x-influxdb-version: ^1.*`
`x-influxdb-build: OSS` | InfluxDB OSS v1 | +| `x-influxdb-build: Enterprise`
(with v1 version) | InfluxDB Enterprise v1 | + +{{% /hide-in %}} + +{{% show-in "core" %}} + +### InfluxDB 3 Core detection + +Check the version using the `influxdb3` command: + +```bash +influxdb3 --version +``` + +Query the `/health` endpoint: + +```bash +curl http://localhost:8181/health +``` + +Check the `/ping` endpoint headers: + +```bash +curl -i http://localhost:8181/ping +``` + +Look for: + +- `x-influxdb-version`: Version number (for example, `3.6.0`) +- `x-influxdb-build`: `Core` + +{{% /show-in %}} + +{{% show-in "enterprise" %}} + +### InfluxDB 3 Enterprise detection + +Check the version using the `influxdb3` command: + +```bash +influxdb3 --version +``` + +Query the `/health` endpoint: + +```bash +curl http://localhost:8181/health +``` + +Check the `/ping` endpoint headers: + +```bash +curl -i http://localhost:8181/ping +``` + +Look for: + +- `x-influxdb-version`: Version number (for example, `3.6.0`) +- `x-influxdb-build`: `Enterprise` + +{{% /show-in %}} + +{{% show-in "clustered" %}} + +### InfluxDB Clustered detection + +Use the `influxctl` CLI to check your cluster version: + +```bash +influxctl version +``` + +To view cluster information: + +```bash +influxctl cluster list +``` + +{{% /show-in %}} + +{{% show-in "cloud-serverless" %}} + +### InfluxDB Cloud Serverless detection + +**InfluxDB Cloud Serverless** can be identified by: + +**URL patterns**: + +- `us-east-1-1.aws.cloud2.influxdata.com` +- `eu-central-1-1.aws.cloud2.influxdata.com` + +**Account settings**: Check your InfluxDB Cloud account dashboard for product and version details. + +**HTTP headers**: API responses include version information in response headers. + +{{% /show-in %}} + +{{% show-in "cloud-dedicated" %}} + +### InfluxDB Cloud Dedicated detection + +**InfluxDB Cloud Dedicated** can be identified by: + +**URL pattern**: `*.influxdb.io` + +- Example: `cluster-id.a.influxdb.io` + +**Account settings**: Check your InfluxDB Cloud Dedicated account dashboard for cluster and version details. + +**HTTP headers**: API responses include version information in response headers. + +{{% /show-in %}} + +{{% show-in "v2" %}} + +### InfluxDB OSS v2 detection + +Check the version using `influxd`: + +```bash +influxd version +``` + +Query the `/health` endpoint and extract the version: + +```bash +curl -s http://localhost:8086/health | jq -r '.version' +``` + +The InfluxDB UI displays the version: + +- On the login page +- In the right column of the main landing page +- In the user menu dropdown + +For more details, see [How can I identify my InfluxDB version?](/influxdb/v2/reference/faq/#administration-1) + +{{% /show-in %}} + +{{% show-in "cloud" %}} + +### InfluxDB Cloud (TSM) detection + +**InfluxDB Cloud (TSM)** can be identified by: + +**URL patterns** (regional cloud2.influxdata.com URLs, excluding Serverless regions): + +- `us-west-2-1.aws.cloud2.influxdata.com` +- `us-west-2-2.aws.cloud2.influxdata.com` +- `us-east-1-2.aws.cloud2.influxdata.com` (note: different from Serverless) +- `us-central1-1.gcp.cloud2.influxdata.com` +- `westeurope-1.azure.cloud2.influxdata.com` +- `eastus-1.azure.cloud2.influxdata.com` + +**Account settings**: Check your InfluxDB Cloud account dashboard for product details. + +**HTTP headers**: API responses include version information in response headers. + +{{% /show-in %}} + +{{% show-in "v1" %}} + +### InfluxDB OSS v1 / Enterprise v1 detection + +Check the version using `influxd`: + +```bash +influxd version +``` + +Check the `/ping` endpoint headers: + +```bash +curl -i http://localhost:8086/ping +``` + +Look for the `x-influxdb-version` header (for example, `1.11.7`). + +For Enterprise v1, the `x-influxdb-build` header will show `Enterprise`. + +{{% /show-in %}} + +{{% hide-in "core,enterprise,cloud-serverless,cloud-dedicated,clustered,v2,cloud,v1" %}} + +## Product-specific methods + +### InfluxDB 3 Core and Enterprise + +{{< tabs-wrapper >}} +{{% tabs %}} +[Command line](#) +[Health endpoint](#) +[HTTP headers](#) +{{% /tabs %}} + +{{% tab-content %}} + +Check the version using the `influxdb3` command: + +```bash +influxdb3 --version +``` + +{{% /tab-content %}} + +{{% tab-content %}} + +Query the `/health` endpoint: + +```bash +curl http://localhost:8181/health +``` + +The response includes version information and build details. + +{{% /tab-content %}} + +{{% tab-content %}} + +Check the `/ping` endpoint headers: + +```bash +curl -i http://localhost:8181/ping +``` + +Look for: + +- `x-influxdb-version`: Version number (for example, `3.6.0`) +- `x-influxdb-build`: `Core` or `Enterprise` + +{{% /tab-content %}} + +{{< /tabs-wrapper >}} + +### InfluxDB Clustered + +Use the `influxctl` CLI to check your cluster version: + +```bash +influxctl version +``` + +To view cluster information: + +```bash +influxctl cluster list +``` + +### InfluxDB OSS v2 + +{{< tabs-wrapper >}} +{{% tabs %}} +[Command line](#) +[Health API](#) +[User interface](#) +{{% /tabs %}} + +{{% tab-content %}} + +Check the version using `influxd`: + +```bash +influxd version +``` + +**Example output:** + +``` +InfluxDB 2.7.12 (git: x0x000xx0x) build_date: 2024-MM-DDThh:mm:ssZ +``` + +{{% /tab-content %}} + +{{% tab-content %}} + +Query the `/health` endpoint and extract the version: + +```bash +curl -s http://localhost:8086/health | jq -r '.version' +``` + +{{% /tab-content %}} + +{{% tab-content %}} + +The InfluxDB UI displays the version: + +- On the login page +- In the right column of the main landing page +- In the user menu dropdown + +{{% /tab-content %}} + +{{< /tabs-wrapper >}} + +For more details, see [How can I identify my InfluxDB version?](/influxdb/v2/reference/faq/#administration-1) + +### InfluxDB Cloud (Serverless, Dedicated, TSM) + +For InfluxDB Cloud products, check the version information: + +- **Account settings**: Version details appear in your account dashboard +- **UI footer**: The version may be displayed at the bottom of the web interface +- **HTTP headers**: API responses include version headers +- **URL pattern**: See [By URL pattern](#by-url-pattern) above + +### InfluxDB OSS v1 and Enterprise v1 + +{{< tabs-wrapper >}} +{{% tabs %}} +[Command line](#) +[HTTP API](#) +{{% /tabs %}} + +{{% tab-content %}} + +Check the version using `influxd`: + +```bash +influxd version +``` + +{{% /tab-content %}} + +{{% tab-content %}} + +Check the `/ping` endpoint headers: + +```bash +curl -i http://localhost:8086/ping +``` + +Look for the `x-influxdb-version` header (for example, `1.11.7`). + +{{% /tab-content %}} + +{{< /tabs-wrapper >}} + +{{% /hide-in %}} + +{{% hide-in "core,enterprise,cloud-serverless,cloud-dedicated,clustered,v2,cloud,v1,enterprise-v1" %}} + +## Understanding InfluxDB products + +InfluxData offers multiple InfluxDB products to suit different use cases: + +| Product | License | Hosting | Query Languages | Default Port | +| ----------------------------- | --------- | ------------------------ | ------------------- | ------------ | +| **InfluxDB 3 Core** | Free | Self-hosted | SQL, InfluxQL | 8181 | +| **InfluxDB 3 Enterprise** | Paid | Self-hosted | SQL, InfluxQL | 8181 | +| **InfluxDB Cloud Serverless** | Free/Paid | Cloud | SQL, InfluxQL, Flux | N/A | +| **InfluxDB Cloud Dedicated** | Paid | Cloud | SQL, InfluxQL | N/A | +| **InfluxDB Clustered** | Paid | Self-hosted (Kubernetes) | SQL, InfluxQL | Custom | +| **InfluxDB OSS v2** | Free | Self-hosted | InfluxQL, Flux | 8086 | +| **InfluxDB Cloud (TSM)** | Free/Paid | Cloud | InfluxQL, Flux | N/A | +| **InfluxDB OSS v1** | Free | Self-hosted | InfluxQL | 8086 | +| **InfluxDB Enterprise v1** | Paid | Self-hosted | InfluxQL, Flux | 8086 | +| **InfluxDB Cloud 1** | Paid | Cloud | InfluxQL | N/A | + +### Key characteristics + +- **InfluxDB 3** products use SQL and InfluxQL, run on port 8181 (self-hosted), and provide improved performance and scalability +- **InfluxDB v2** products use InfluxQL and Flux, run on port 8086 (self-hosted), and use a bucket-based data model +- **InfluxDB v1** products use InfluxQL, run on port 8086 (self-hosted), and use a database-based data model + +{{% /hide-in %}} + +## Understanding InfluxDB products + +For a complete comparison of InfluxDB versions and deployment options, see the [InfluxDB platform overview](/platform/). + +## Troubleshooting + +### Can't access your InfluxDB instance? + +If you can't directly access your InfluxDB instance: + +1. Use the [interactive version detector](#identify-your-influxdb-version) above or {{< ask-ai-link link-text="Ask InfluxData AI" query="Help determine my InfluxDB version based on licensing, hosting, server age, and API." >}} +2. Answer questions about your setup: + - License type (paid or free) + - Hosting model (cloud or self-hosted) + - Server age + - Query language preferences +3. Get product recommendations based on your answers + +### Still not sure? + +If you're still uncertain, see the [Support and feedback](#bug-reports-and-feedback) options. diff --git a/content/shared/influxdb-v2/query-data/influxql/_index.md b/content/shared/influxdb-v2/query-data/influxql/_index.md index d2f5a5c3e6..8993a93d81 100644 --- a/content/shared/influxdb-v2/query-data/influxql/_index.md +++ b/content/shared/influxdb-v2/query-data/influxql/_index.md @@ -1,5 +1,4 @@ - -Use InfluxQL (an SQL-like query language) to interact with InfluxDB, and query and analyze your times series data. +Use InfluxQL (an SQL-like query language) to interact with InfluxDB, and API features analyze your times series data. In InfluxDB 1.x, data is stored in [databases](/influxdb/v1/concepts/glossary/#database) and [retention policies](/influxdb/v1/concepts/glossary/#retention-policy-rp). @@ -23,16 +22,16 @@ For complete InfluxQL reference documentation, see the ## Verify buckets have a mapping 1. To verify the buckets you want to query are mapped to a database and retention policy, use the [`influx` CLI](/influxdb/version/reference/cli/influx/) or the [InfluxDB API](/influxdb/version/reference/api/). -_For examples, see [List DBRP mappings](/influxdb/version/query-data/influxql/dbrp/#list-dbrp-mappings)._ + *For examples, see [List DBRP mappings](/influxdb/version/query-data/influxql/dbrp/#list-dbrp-mappings).* 2. If you **do not find a DBRP mapping for a bucket**, [create a new DBRP mapping](/influxdb/version/query-data/influxql/dbrp/#create-dbrp-mappings) to -map the unmapped bucket. + map the unmapped bucket. ## Create DBRP mappings for unmapped buckets - Use the [`influx` CLI](/influxdb/version/reference/cli/influx/) or the [InfluxDB API](/influxdb/version/reference/api/) -to manually create DBRP mappings for unmapped buckets. -_For examples, see [Create DBRP mappings](/influxdb/version/query-data/influxql/dbrp/#create-dbrp-mappings)._ + to manually create DBRP mappings for unmapped buckets. + *For examples, see [Create DBRP mappings](/influxdb/version/query-data/influxql/dbrp/#create-dbrp-mappings).* ## Query a mapped bucket with InfluxQL @@ -42,6 +41,7 @@ _For examples, see [Create DBRP mappings](/influxdb/version/query-data/influxql/ [InfluxDB API](#) {{% /tabs %}} {{% tab-content %}} + The [`influx` CLI](/influxdb/version/reference/cli/influx/) provides an [InfluxQL shell](/influxdb/version/tools/influxql-shell/) where you can execute InfluxQL queries in an interactive Read-Eval-Print-Loop (REPL). @@ -66,8 +66,10 @@ The [`influx` CLI](/influxdb/version/reference/cli/influx/) provides an [InfluxQ For more information, see how to [use the InfluxQL shell](/influxdb/version/tools/influxql-shell/). For more information about DBRP mappings, see [Manage DBRP mappings](/influxdb/version/query-data/influxql/dbrp/). + {{% /tab-content %}} {{% tab-content %}} + The [InfluxDB 1.x compatibility API](/influxdb/version/reference/api/influxdb-1x/) supports @@ -77,10 +79,10 @@ all InfluxDB 1.x client libraries and integrations in InfluxDB {{< current-versi - **Request method:** `GET` - **Headers:** - - **Authorization:** _See [compatibility API authentication](/influxdb/version/reference/api/influxdb-1x/#authentication)_ + - **Authorization:** *See [compatibility API authentication](/influxdb/version/reference/api/influxdb-1x/#authentication)* - **Query parameters:** - **db**: 1.x database to query - - **rp**: 1.x retention policy to query _(if no retention policy is specified, InfluxDB uses the default retention policy for the specified database)_ + - **rp**: 1.x retention policy to query *(if no retention policy is specified, InfluxDB uses the default retention policy for the specified database)* - **q**: URL-encoded InfluxQL query {{% api/url-encode-note %}} @@ -96,7 +98,9 @@ all InfluxDB 1.x client libraries and integrations in InfluxDB {{< current-versi 2. (Optional) To return results as **CSV**, include the `Accept: application/csv` header. For more information about DBRP mappings, see [Manage DBRP mappings](/influxdb/version/query-data/influxql/dbrp/). + + {{% /tab-content %}} {{< /tabs-wrapper >}} @@ -107,12 +111,13 @@ InfluxDB OSS 2.x supports the following InfluxQL statements and clauses. See sup {{< flex >}} {{< flex-content >}} {{% note %}} + ##### Supported InfluxQL queries -- `DELETE`* -- `DROP MEASUREMENT`* +- `DELETE`\* +- `DROP MEASUREMENT`\* - `EXPLAIN ANALYZE` -- `SELECT` _(read-only)_ +- `SELECT` *(read-only)* - `SHOW DATABASES` - `SHOW SERIES` - `SHOW MEASUREMENTS` @@ -133,11 +138,11 @@ InfluxDB OSS 2.x supports the following InfluxQL statements and clauses. See sup - `SELECT INTO` - `ALTER` - `CREATE` -- `DROP` _(limited support)_ +- `DROP` *(limited support)* - `GRANT` - `KILL` - `REVOKE` - `SHOW SERIES CARDINALITY` -{{% /warn %}} -{{< /flex-content >}} -{{< /flex >}} + {{% /warn %}} + {{< /flex-content >}} + {{< /flex >}} diff --git a/cypress/e2e/content/ask-ai.cy.js b/cypress/e2e/content/ask-ai.cy.js new file mode 100644 index 0000000000..87961ce60a --- /dev/null +++ b/cypress/e2e/content/ask-ai.cy.js @@ -0,0 +1,403 @@ +/// + +/** + * Ask AI Widget E2E Test Suite + * + * Tests for the Kapa.ai Ask AI widget and ask-ai-link shortcode + * + * NOTE: Open the chat window sparingly. + * + * COMPREHENSIVE TEST SCENARIOS CHECKLIST: + * + * Widget Initialization: + * ---------------------- + * - [x] Widget script loads without errors + * - [x] window.Kapa object is available + * - [x] Widget trigger button is visible + * - [ ] Widget initializes with correct configuration + * - [ ] No JavaScript console errors during initialization + * + * Widget Trigger Button: + * ---------------------- + * - [x] Button exists in footer + * - [x] Button has correct class (ask-ai-open) + * - [x] Button opens widget when clicked + * - [x] Widget modal becomes visible after click + * - [ ] Widget overlay appears (if configured) + * + * Ask AI Link Shortcode: + * ---------------------- + * - [x] Link renders correctly in content + * - [x] Link has correct text (default or custom) + * - [x] Link has ask-ai-open class + * - [x] Link has onclick handler for analytics + * - [x] Link has data-query attribute with query + * - [x] Link includes gtag analytics in onclick + * - [x] Link opens widget when clicked + * - [x] Query is pre-filled without auto-submitting + * - [x] Widget modal becomes visible after click + * - [x] Widget overlay appears (if configured) + * + * Widget Functionality: + * --------------------- + * - [ ] Widget opens in modal/drawer + * - [ ] Widget shows input field + * - [ ] Widget shows example questions + * - [ ] Widget accepts user input + * - [ ] Widget submits queries to AI + * - [ ] Widget displays AI responses + * - [ ] Widget can be closed + * - [ ] Widget reopens with history preserved + * + * Query Pre-population: + * --------------------- + * - [x] window.Kapa.open() accepts query parameter + * - [x] Query appears in input field when pre-populated + * - [x] Query is submitted automatically with submit: true + * - [ ] Pre-populated query respects special characters + * - [ ] Pre-populated query handles HTML entities correctly + * + * Analytics Tracking: + * ------------------- + * - [ ] Link click fires gtag event + * - [ ] Event includes correct custom_map fields + * - [ ] Event includes query text + * - [ ] Event includes section (pathname) + * - [ ] Event includes interaction_type: 'inline_link' + * + * Error Handling: + * --------------- + * - [x] No console errors when widget loads + * - [ ] Graceful handling if window.Kapa is undefined + * - [ ] Graceful handling if widget script fails to load + * - [ ] Error messages are user-friendly + * + * Accessibility: + * -------------- + * - [ ] Widget trigger button is keyboard accessible + * - [ ] Ask AI links are keyboard accessible + * - [ ] Widget modal has proper focus management + * - [ ] Widget has ARIA labels + * - [ ] Screen reader announcements work + * + * Cross-browser: + * -------------- + * - [ ] Works in Chrome + * - [ ] Works in Firefox + * - [ ] Works in Safari + * - [ ] Works in Edge + */ + +function beforeTest() { + cy.viewport(1440, 900); +} + +describe('Ask AI Widget and Link', function () { + describe('Widget Initialization', function () { + beforeEach(() => { + cy.visit('/influxdb3/core/admin/identify-version/'); + beforeTest(); + }); + + it('should load widget script without JavaScript errors', function () { + cy.window().then((win) => { + const errors = []; + const originalError = win.console.error; + + win.console.error = (...args) => { + errors.push(args.join(' ')); + originalError.apply(win.console, args); + }; + + // Wait for widget to initialize + cy.wait(2000); + + cy.then(() => { + // Filter for Kapa-related errors + const kapaErrors = errors.filter( + (log) => + log.includes('kapa') || + log.includes('Kapa') || + log.includes('ask-ai') + ); + expect(kapaErrors).to.have.length(0); + }); + }); + }); + + it('should make window.Kapa available', function () { + cy.window().should('have.property', 'Kapa'); + cy.window().then((win) => { + expect(win.Kapa).to.be.a('function'); + }); + }); + + it('should render widget trigger button in footer', function () { + cy.get('.ask-ai-trigger a.ask-ai-open').should('be.visible'); + cy.get('.ask-ai-trigger').should('contain', 'Ask AI'); + }); + + it('should have correct class for widget trigger', function () { + cy.get('.ask-ai-trigger a.ask-ai-open') + .should('have.class', 'ask-ai-open') + .and('be.visible'); + }); + }); + + describe('Widget Trigger Button', function () { + // ONLY test that opens widget via button - combines all button functionality tests + it('should open widget when trigger button is clicked', function () { + cy.visit('/influxdb3/core/admin/identify-version/'); + beforeTest(); + + // Click the Ask AI button + cy.get('.ask-ai-trigger a.ask-ai-open').click(); + + // Wait for widget modal to appear + cy.get('#kapa-modal-content', { + includeShadowDom: true, + timeout: 1000, + }).should('be.visible'); + }); + }); + + describe('Ask AI Link Shortcode', function () { + beforeEach(() => { + cy.visit('/influxdb3/core/admin/identify-version/'); + beforeTest(); + }); + + it('should render ask-ai-link with correct attributes', function () { + // Validate DOM without clicking + cy.get('a.ask-ai-open') + .contains('Ask InfluxData AI') + .should('be.visible') + .should('have.class', 'ask-ai-open') + .should( + 'have.attr', + 'data-query', + 'Help determine my InfluxDB version based on licensing, hosting, server age, and API.' + ); + }); + + // ONLY test that opens widget via link - combines query pre-fill validation + it('should open widget with pre-filled query when ask-ai-link is clicked', function () { + cy.get('.article--content a.ask-ai-open') + .contains('Ask InfluxData AI') + .as('askAILink'); + // cy.get('@askAILink').scrollIntoView(); + cy.get('@askAILink').click(); + // Widget container MUST become visible + cy.get('#kapa-modal-content', { includeShadowDom: true, timeout: 1000 }) + .should('be.visible', 'Widget must open when ask-ai-link is clicked') + // Verify query is pre-filled (validates pre-fill behavior) + .find('textarea, input[type="text"]') + .should( + 'have.value', + 'Help determine my InfluxDB version based on licensing, hosting, server age, and API.' + ); + }); + }); + + describe('Error Handling', function () { + beforeEach(() => { + cy.visit('/influxdb3/core/admin/identify-version/'); + beforeTest(); + }); + + it('should not throw console errors when link is clicked', function () { + cy.window().then((win) => { + const errors = []; + const originalError = win.console.error; + + win.console.error = (...args) => { + errors.push(args.join(' ')); + originalError.apply(win.console, args); + }; + + // Validate without actually clicking (DOM interaction only) + cy.get('a.ask-ai-open').contains('Ask InfluxData AI'); + + cy.wait(500); + + cy.then(() => { + // Check for Kapa-related errors + const kapaErrors = errors.filter( + (log) => + (log.includes('kapa') || log.includes('Kapa')) && + !log.includes('Unknown method') + ); + expect(kapaErrors).to.have.length(0); + }); + }); + }); + + it('should handle missing window.Kapa gracefully', function () { + cy.window().then((win) => { + // Temporarily remove Kapa + const originalKapa = win.Kapa; + delete win.Kapa; + + // Validate link without opening widget + cy.get('a.ask-ai-open') + .contains('Ask InfluxData AI') + .should('have.attr', 'onclick'); + + // Restore Kapa + win.Kapa = originalKapa; + }); + }); + }); + + describe('Ask AI Widget Configuration', function () { + describe('Input Placeholder', function () { + it('should have unified InfluxDB placeholder on InfluxDB 3 pages', function () { + cy.visit('/influxdb3/core/'); + beforeTest(); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const placeholder = $script.attr( + 'data-modal-ask-ai-input-placeholder' + ); + expect(placeholder).to.equal( + 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' + ); + }); + }); + + it('should have unified InfluxDB placeholder on InfluxDB 2.x pages', function () { + cy.visit('/influxdb/v2/'); + beforeTest(); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const placeholder = $script.attr( + 'data-modal-ask-ai-input-placeholder' + ); + expect(placeholder).to.equal( + 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' + ); + }); + }); + + it('should have unified InfluxDB placeholder on InfluxDB 1.x pages', function () { + cy.visit('/influxdb/v1/'); + beforeTest(); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const placeholder = $script.attr( + 'data-modal-ask-ai-input-placeholder' + ); + expect(placeholder).to.equal( + 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' + ); + }); + }); + + it('should have default placeholder when no product-specific one exists', function () { + cy.visit('/platform/'); + beforeTest(); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const placeholder = $script.attr( + 'data-modal-ask-ai-input-placeholder' + ); + expect(placeholder).to.include('Ask questions about InfluxDB'); + expect(placeholder).to.include('Specify your product and version'); + }); + }); + }); + + describe('InfluxDB 3 Products', function () { + it('should configure Explorer-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/explorer/'); + beforeTest(); + + // Check the Kapa widget script tag has correct data-modal-example-questions attribute + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('visualize data using Explorer'); + }); + }); + + it('should configure Core-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/core/'); + beforeTest(); + + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include( + 'Python Processing engine using InfluxDB 3 Core' + ); + // Should NOT have read replica question + expect(questions).to.not.include('replica'); + }); + }); + + it('should configure Enterprise-specific questions in Kapa widget', function () { + cy.visit('/influxdb3/enterprise/'); + beforeTest(); + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('install and run InfluxDB 3 Enterprise'); + }); + }); + }); + + describe('InfluxDB v1 Products', function () { + it('should configure Enterprise v1-specific questions in Kapa widget', function () { + cy.visit('/enterprise_influxdb/v1/'); + beforeTest(); + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + expect(questions).to.include('configure InfluxDB Enterprise v1'); + }); + }); + }); + + describe('InfluxDB OSS v2', function () { + it('should configure v2-specific questions with version name in Kapa widget', function () { + cy.visit('/influxdb/v2/get-started/'); + beforeTest(); + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + // Check for v2-specific questions + expect(questions).to.include( + 'write and query data using InfluxDB OSS v2' + ); + // Should NOT have v1-specific questions + expect(questions).to.not.include('retention policies'); + }); + }); + }); + + describe('InfluxDB OSS v1', function () { + it('should configure v1-specific questions with version name in Kapa widget', function () { + cy.visit('/influxdb/v1/'); + beforeTest(); + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + // Check for v1-specific questions + expect(questions).to.include( + 'query data with InfluxQL using InfluxDB OSS v1' + ); + // Should NOT have v2-specific questions + expect(questions).to.not.include('auth tokens'); + }); + }); + }); + + describe('InfluxDB Cloud (TSM)', function () { + it('should configure Cloud-specific questions with correct naming in Kapa widget', function () { + cy.visit('/influxdb/cloud/'); + beforeTest(); + cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { + const questions = $script.attr('data-modal-example-questions'); + // Check for Cloud-specific questions + expect(questions).to.include( + 'write and query data using InfluxDB Cloud (TSM)' + ); + }); + }); + }); + }); +}); diff --git a/cypress/e2e/page-context.cy.js b/cypress/e2e/page-context.cy.js index 620c94965a..fa42c6e5fd 100644 --- a/cypress/e2e/page-context.cy.js +++ b/cypress/e2e/page-context.cy.js @@ -112,255 +112,3 @@ describe('Page Context - Product Mapping', function () { }); }); }); - -describe('Ask AI Widget Configuration', function () { - describe('InfluxDB 3 Products', function () { - it('should configure Explorer-specific questions in Kapa widget', function () { - cy.visit('/influxdb3/explorer/'); - - // Check the Kapa widget script tag has correct data-modal-example-questions attribute - cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { - const questions = $script.attr('data-modal-example-questions'); - expect(questions).to.include('install and run Explorer'); - expect(questions).to.include('query data using Explorer'); - expect(questions).to.include('visualize data using Explorer'); - // Should NOT have Core/Enterprise specific questions - expect(questions).to.not.include('plugin'); - expect(questions).to.not.include('read replica'); - }); - }); - - it('should configure Core-specific questions in Kapa widget', function () { - cy.visit('/influxdb3/core/'); - - cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { - const questions = $script.attr('data-modal-example-questions'); - expect(questions).to.include('install and run'); - expect(questions).to.include('plugin for the Python Processing engine'); - // Should NOT have read replica question - expect(questions).to.not.include('read replica'); - }); - }); - - it('should configure Enterprise-specific questions in Kapa widget', function () { - cy.visit('/influxdb3/enterprise/'); - - cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { - const questions = $script.attr('data-modal-example-questions'); - expect(questions).to.include('install and run'); - expect(questions).to.include('read replica node'); - }); - }); - }); - - describe('InfluxDB v1 Products', function () { - it('should configure Enterprise v1-specific questions in Kapa widget', function () { - cy.visit('/enterprise_influxdb/v1/'); - - cy.get('script[src*="kapa-widget.bundle.js"]').should(($script) => { - const questions = $script.attr('data-modal-example-questions'); - expect(questions).to.include('configure the server'); - expect(questions).to.include('replicate data from OSS'); - expect(questions).to.include('query data'); - }); - }); - }); -}); - -describe('Product Data Validation - AI Questions', function () { - describe('InfluxDB 3 Products', function () { - it('should have correct Explorer AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_explorer).to.exist; - expect(products.influxdb3_explorer.name).to.equal( - 'InfluxDB 3 Explorer' - ); - expect(products.influxdb3_explorer.ai_sample_questions).to.exist; - expect(products.influxdb3_explorer.ai_sample_questions).to.be.an( - 'array' - ); - - const questionsText = - products.influxdb3_explorer.ai_sample_questions.join(' '); - expect(questionsText).to.include('install and run'); - expect(questionsText).to.include('query data'); - expect(questionsText).to.include('visualize data'); - expect(questionsText).to.not.include('plugin'); - expect(questionsText).to.not.include('read replica'); - }); - }); - - it('should have correct Core AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_core).to.exist; - expect(products.influxdb3_core.name).to.equal('InfluxDB 3 Core'); - expect(products.influxdb3_core.ai_sample_questions).to.exist; - - const questionsText = - products.influxdb3_core.ai_sample_questions.join(' '); - expect(questionsText).to.include('install and run'); - expect(questionsText).to.include('plugin'); - expect(questionsText).to.not.include('read replica'); - }); - }); - - it('should have correct Enterprise AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_enterprise).to.exist; - expect(products.influxdb3_enterprise.name).to.equal( - 'InfluxDB 3 Enterprise' - ); - expect(products.influxdb3_enterprise.ai_sample_questions).to.exist; - - const questionsText = - products.influxdb3_enterprise.ai_sample_questions.join(' '); - expect(questionsText).to.include('install and run'); - expect(questionsText).to.include('read replica'); - }); - }); - - it('should have correct Cloud Serverless AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_cloud_serverless).to.exist; - expect(products.influxdb3_cloud_serverless.name).to.equal( - 'InfluxDB Cloud Serverless' - ); - expect(products.influxdb3_cloud_serverless.ai_sample_questions).to - .exist; - - const questionsText = - products.influxdb3_cloud_serverless.ai_sample_questions.join(' '); - expect(questionsText).to.include('migrate from Cloud'); - expect(questionsText).to.include('write data'); - }); - }); - - it('should have correct Cloud Dedicated AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_cloud_dedicated).to.exist; - expect(products.influxdb3_cloud_dedicated.name).to.equal( - 'InfluxDB Cloud Dedicated' - ); - expect(products.influxdb3_cloud_dedicated.ai_sample_questions).to.exist; - - const questionsText = - products.influxdb3_cloud_dedicated.ai_sample_questions.join(' '); - expect(questionsText).to.include('migrate from v1'); - expect(questionsText).to.include('SQL'); - }); - }); - - it('should have correct Clustered AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb3_clustered).to.exist; - expect(products.influxdb3_clustered.name).to.equal( - 'InfluxDB Clustered' - ); - expect(products.influxdb3_clustered.ai_sample_questions).to.exist; - - const questionsText = - products.influxdb3_clustered.ai_sample_questions.join(' '); - expect(questionsText).to.include('Helm chart'); - expect(questionsText).to.include('SQL'); - }); - }); - }); - - describe('InfluxDB v2 and Cloud Products', function () { - it('should have correct InfluxDB v2 AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb).to.exist; - expect(products.influxdb.name).to.equal('InfluxDB'); - expect(products.influxdb.ai_sample_questions).to.exist; - - const questionsText = products.influxdb.ai_sample_questions.join(' '); - expect(questionsText).to.include('write and query data'); - expect(questionsText).to.include('migrate to InfluxDB 3'); - expect(questionsText).to.include('auth tokens'); - }); - }); - - it('should have correct Cloud (TSM) AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.influxdb_cloud).to.exist; - expect(products.influxdb_cloud.name).to.equal('InfluxDB Cloud (TSM)'); - expect(products.influxdb_cloud.ai_sample_questions).to.exist; - - const questionsText = - products.influxdb_cloud.ai_sample_questions.join(' '); - expect(questionsText).to.include('write and query data'); - expect(questionsText).to.include('Cloud (TSM)'); - }); - }); - }); - - describe('InfluxDB v1 Products', function () { - it('should have correct Enterprise v1 AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.enterprise_influxdb).to.exist; - expect(products.enterprise_influxdb.name).to.equal( - 'InfluxDB Enterprise v1' - ); - expect(products.enterprise_influxdb.ai_sample_questions).to.exist; - - const questionsText = - products.enterprise_influxdb.ai_sample_questions.join(' '); - expect(questionsText).to.include('configure the server'); - expect(questionsText).to.include('replicate data'); - expect(questionsText).to.include('query data'); - }); - }); - }); - - describe('Other Products', function () { - it('should have correct Telegraf AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.telegraf).to.exist; - expect(products.telegraf.name).to.equal('Telegraf'); - expect(products.telegraf.ai_sample_questions).to.exist; - - const questionsText = products.telegraf.ai_sample_questions.join(' '); - expect(questionsText).to.include('configure Telegraf'); - expect(questionsText).to.include('custom'); - expect(questionsText).to.include('MQTT'); - }); - }); - - it('should have correct Chronograf AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.chronograf).to.exist; - expect(products.chronograf.name).to.equal('Chronograf'); - expect(products.chronograf.ai_sample_questions).to.exist; - - const questionsText = products.chronograf.ai_sample_questions.join(' '); - expect(questionsText).to.include('configure Chronograf'); - expect(questionsText).to.include('dashboard'); - }); - }); - - it('should have correct Kapacitor AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.kapacitor).to.exist; - expect(products.kapacitor.name).to.equal('Kapacitor'); - expect(products.kapacitor.ai_sample_questions).to.exist; - - const questionsText = products.kapacitor.ai_sample_questions.join(' '); - expect(questionsText).to.include('configure Kapacitor'); - expect(questionsText).to.include('custom task'); - }); - }); - - it('should have correct Flux AI configuration', function () { - cy.task('getData', 'products').then((products) => { - expect(products.flux).to.exist; - expect(products.flux.name).to.equal('Flux'); - expect(products.flux.ai_sample_questions).to.exist; - - const questionsText = products.flux.ai_sample_questions.join(' '); - expect(questionsText).to.include('query with Flux'); - expect(questionsText).to.include('transform data'); - expect(questionsText).to.include('join data'); - }); - }); - }); -}); diff --git a/data/products.yml b/data/products.yml index 591e45af9c..02c233f543 100644 --- a/data/products.yml +++ b/data/products.yml @@ -23,9 +23,10 @@ influxdb3_core: x-influxdb-build: 'Core' url_contains: ['localhost:8181'] ai_sample_questions: - - How do I install and run the database? - - Help me write a plugin for the Python Processing engine - - How do I write data using the HTTP API? + - What's my InfluxDB version? + - How do I install and run InfluxDB 3 Core? + - Help me write a plugin for the Python Processing engine using InfluxDB 3 Core + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_enterprise: @@ -53,9 +54,10 @@ influxdb3_enterprise: x-influxdb-build: 'Enterprise' url_contains: ['localhost:8181'] ai_sample_questions: - - How do I install and run the database? - - Help me write a plugin for the Python Processing engine - - How do I start a read replica node? + - What's my InfluxDB version? + - How do I install and run InfluxDB 3 Enterprise? + - How do I start a read replica node using InfluxDB 3 Enterprise? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_explorer: @@ -71,7 +73,7 @@ influxdb3_explorer: - How do I install and run Explorer? - How do I query data using Explorer? - How do I visualize data using Explorer? - + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_serverless: @@ -98,8 +100,10 @@ influxdb3_cloud_serverless: detection: url_contains: ['us-east-1-1.aws.cloud2.influxdata.com', 'eu-central-1-1.aws.cloud2.influxdata.com'] ai_sample_questions: - - How do I migrate from Cloud (TSM)? - - What tools can I use to write data? + - What's my InfluxDB version? + - How do I migrate from Cloud (TSM) to Cloud Serverless? + - What tools can I use to write data to InfluxDB Cloud Serverless? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_dedicated: @@ -125,9 +129,10 @@ influxdb3_cloud_dedicated: detection: url_contains: ['influxdb.io'] ai_sample_questions: - - How do I migrate from v1? - - What tools can I use to write data? - - How do I use SQL and parameterized queries? + - What's my InfluxDB version? + - How do I migrate from InfluxDB v1 to Cloud Dedicated? + - How do I use SQL and parameterized queries with InfluxDB Cloud Dedicated? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_clustered: @@ -153,13 +158,16 @@ influxdb3_clustered: ping_headers: x-influxdb-version: 'influxqlbridged-development' ai_sample_questions: - - How do I use a Helm chart to configure the cluster? - - What tools can I use to write data? - - How do I use SQL and parameterized queries? + - What's my InfluxDB version? + - How do I use a Helm chart to configure InfluxDB Clustered? + - How do I use SQL and parameterized queries with InfluxDB Clustered? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb: name: InfluxDB + name__v2: InfluxDB OSS v2 + name__v1: InfluxDB OSS v1 altname: InfluxDB OSS namespace: influxdb succeeded_by: influxdb3_core @@ -190,18 +198,20 @@ influxdb: x-influxdb-version: '^(1|2)\.' url_contains: ['localhost:8086'] ai_sample_questions: - - How do I write and query data? - - How can I migrate to InfluxDB 3? - - How do I manage auth tokens? + - What's my InfluxDB version? + - How do I write and query data using InfluxDB OSS v2? + - How can I migrate from InfluxDB OSS v2 to InfluxDB 3? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" ai_sample_questions__v1: - - How do I query data with InfluxQL? - - How do I set up continuous queries? - - How do I manage retention policies? + - What's my InfluxDB version? + - How do I query data with InfluxQL using InfluxDB OSS v1? + - How do I set up continuous queries in InfluxDB OSS v1? ai_source_group_ids__v1: "d809f67b-867d-4f17-95f0-c33dbadbf15f" influxdb_cloud: name: InfluxDB Cloud (TSM) + name__vcloud: InfluxDB Cloud (TSM) altname: InfluxDB Cloud namespace: influxdb menu_category: managed @@ -221,9 +231,10 @@ influxdb_cloud: detection: url_contains: ['us-west-2-1.aws.cloud2.influxdata.com', 'us-west-2-2.aws.cloud2.influxdata.com', 'us-east-1-1.aws.cloud2.influxdata.com', 'eu-central-1-1.aws.cloud2.influxdata.com', 'us-central1-1.gcp.cloud2.influxdata.com', 'westeurope-1.azure.cloud2.influxdata.com', 'eastus-1.azure.cloud2.influxdata.com'] ai_sample_questions: - - How do I write and query data? + - What's my InfluxDB version? + - How do I write and query data using InfluxDB Cloud (TSM)? - How is Cloud (TSM) different from Cloud Serverless? - - How do I manage auth tokens? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" telegraf: @@ -239,6 +250,7 @@ telegraf: - How do I configure Telegraf for InfluxDB 3? - How do I write a custom Telegraf plugin? - How do I use Telegraf for MQTT? + ai_input_placeholder: "Ask questions about Telegraf" chronograf: name: Chronograf @@ -253,6 +265,7 @@ chronograf: - How do I configure Chronograf for InfluxDB v1? - How do I create a dashboard in Chronograf? - How do I use Grafana to visualize data stored in InfluxDB 3? + ai_input_placeholder: "Ask questions about Chronograf" kapacitor: name: Kapacitor @@ -267,6 +280,7 @@ kapacitor: - How do I configure Kapacitor for InfluxDB v1? - How do I write a custom task for Kapacitor? - How do I create tasks using InfluxDB 3 Core? + ai_input_placeholder: "Ask questions about Kapacitor" enterprise_influxdb: name: "InfluxDB Enterprise v1" @@ -290,9 +304,10 @@ enterprise_influxdb: ping_headers: x-influxdb-build: 'Enterprise' ai_sample_questions: - - How can I configure the server? - - How do I replicate data from OSS? - - How do I query data? + - What's my InfluxDB version? + - How can I configure InfluxDB Enterprise v1? + - How do I replicate data from OSS to InfluxDB Enterprise v1? + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f" flux: @@ -306,4 +321,5 @@ flux: - How do I query with Flux? - How do I transform data with Flux? - How do I join data with Flux? + ai_input_placeholder: "Ask questions about Flux" ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f,3e905caa-dd6f-464b-abf9-c3880e09f128" diff --git a/layouts/partials/article.html b/layouts/partials/article.html index e6becbb1fc..f97e72b76c 100644 --- a/layouts/partials/article.html +++ b/layouts/partials/article.html @@ -1,7 +1,7 @@
-

{{ .Title | .RenderString }}

+

{{ .RenderString .Title }}

{{ partial "article/supported-versions.html" . }} {{ partial "article/page-meta.html" . }}
diff --git a/layouts/partials/article/prepend.html b/layouts/partials/article/prepend.html index 6ab3c90613..2b1c44bcaa 100644 --- a/layouts/partials/article/prepend.html +++ b/layouts/partials/article/prepend.html @@ -1,3 +1,12 @@ {{- if .Params.prepend -}} -{{ .Params.prepend | .RenderString }} + {{- if reflect.IsMap .Params.prepend -}} + {{- if .Params.prepend.title -}} +

{{ .Params.prepend.title }}

+ {{- end -}} + {{- if .Params.prepend.content -}} +{{ .RenderString .Params.prepend.content }} + {{- end -}} + {{- else -}} +{{ .RenderString .Params.prepend }} + {{- end -}} {{- end -}} \ No newline at end of file diff --git a/layouts/shortcodes/ask-ai-link.html b/layouts/shortcodes/ask-ai-link.html new file mode 100644 index 0000000000..191e2c397d --- /dev/null +++ b/layouts/shortcodes/ask-ai-link.html @@ -0,0 +1,17 @@ +{{- $linkText := .Get "link-text" | default "Ask Docs AI" -}} +{{- $query := .Get "query" | default "" -}} +{{ $linkText }} diff --git a/layouts/shortcodes/influxdb-version-detector.html b/layouts/shortcodes/influxdb-version-detector.html index 2b9c903210..f7dff204e5 100644 --- a/layouts/shortcodes/influxdb-version-detector.html +++ b/layouts/shortcodes/influxdb-version-detector.html @@ -14,7 +14,7 @@ {{ $context := .Get "context" }} {{ $aiInstruction := .Get "ai_instruction" }} -

Identify your InfluxDB version

+

Identify your InfluxDB version

If you are unsure which InfluxDB product you are using, use our interactive version detector to help identify it:

From 90fc81b7155cd84e765d84cc6e1ff39927ab3594 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Mon, 17 Nov 2025 15:18:22 -0600 Subject: [PATCH 15/15] feat(ask-ai): Tailors placeholder for each version/product. Disables "Viewing " in disclaimer note. --- assets/js/ask-ai.ts | 12 ++++++------ cypress/e2e/content/ask-ai.cy.js | 27 +++++++++++++-------------- data/products.yml | 22 +++++++++++----------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/assets/js/ask-ai.ts b/assets/js/ask-ai.ts index 0241b09425..a58dbcb89d 100644 --- a/assets/js/ask-ai.ts +++ b/assets/js/ask-ai.ts @@ -202,11 +202,11 @@ function getProductInputPlaceholder(): string { } function getProductDisclaimer(): string { - // Build version-specific note if version is available - const versionNote = - version && version !== 'n/a' && productData?.product?.name - ? `**Viewing documentation for ${productData.product.name}**\n\n` - : ''; + // Disabled: Version-specific "Viewing documentation for..." text + // const versionNote = + // version && version !== 'n/a' && productData?.product?.name + // ? `**Viewing documentation for ${productData.product.name}**\n\n` + // : ''; // Check for product-specific custom disclaimer note const customNote = getVersionSpecificConfig('ai_disclaimer_note') as @@ -218,7 +218,7 @@ function getProductDisclaimer(): string { const baseDisclaimer = 'This AI can access [documentation for InfluxDB, clients, and related tools](https://docs.influxdata.com). Information you submit is used in accordance with our [Privacy Policy](https://www.influxdata.com/legal/privacy-policy/).'; - return `${versionNote}${noteContent}${baseDisclaimer}`; + return `${noteContent}${baseDisclaimer}`; } /** diff --git a/cypress/e2e/content/ask-ai.cy.js b/cypress/e2e/content/ask-ai.cy.js index 87961ce60a..102b907ab6 100644 --- a/cypress/e2e/content/ask-ai.cy.js +++ b/cypress/e2e/content/ask-ai.cy.js @@ -180,12 +180,11 @@ describe('Ask AI Widget and Link', function () { ); }); - // ONLY test that opens widget via link - combines query pre-fill validation + // This is the only test that opens the widget modal it('should open widget with pre-filled query when ask-ai-link is clicked', function () { cy.get('.article--content a.ask-ai-open') .contains('Ask InfluxData AI') .as('askAILink'); - // cy.get('@askAILink').scrollIntoView(); cy.get('@askAILink').click(); // Widget container MUST become visible cy.get('#kapa-modal-content', { includeShadowDom: true, timeout: 1000 }) @@ -251,7 +250,7 @@ describe('Ask AI Widget and Link', function () { describe('Ask AI Widget Configuration', function () { describe('Input Placeholder', function () { - it('should have unified InfluxDB placeholder on InfluxDB 3 pages', function () { + it('should have the version name in the placeholder on v3 pages', function () { cy.visit('/influxdb3/core/'); beforeTest(); @@ -259,13 +258,13 @@ describe('Ask AI Widget and Link', function () { const placeholder = $script.attr( 'data-modal-ask-ai-input-placeholder' ); - expect(placeholder).to.equal( - 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' - ); + expect(placeholder).to.contain( + 'Specify your version and product') + .and.to.contain("Core"); }); }); - it('should have unified InfluxDB placeholder on InfluxDB 2.x pages', function () { + it('should have the version name in the placeholder on v2 pages', function () { cy.visit('/influxdb/v2/'); beforeTest(); @@ -273,13 +272,13 @@ describe('Ask AI Widget and Link', function () { const placeholder = $script.attr( 'data-modal-ask-ai-input-placeholder' ); - expect(placeholder).to.equal( - 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' - ); + expect(placeholder).to.contain( + 'Specify your version and product') + .and.to.contain("v2"); }); }); - it('should have unified InfluxDB placeholder on InfluxDB 1.x pages', function () { + it('should have the version name in the placeholder on v1 pages', function () { cy.visit('/influxdb/v1/'); beforeTest(); @@ -287,9 +286,9 @@ describe('Ask AI Widget and Link', function () { const placeholder = $script.attr( 'data-modal-ask-ai-input-placeholder' ); - expect(placeholder).to.equal( - 'Specify your version and product ("InfluxDB 3 Enterprise", "Core", "Enterprise v1") for better results' - ); + expect(placeholder).to.contain( + 'Specify your version and product') + .and.to.contain("v1"); }); }); diff --git a/data/products.yml b/data/products.yml index 02c233f543..c1e54cbe9c 100644 --- a/data/products.yml +++ b/data/products.yml @@ -26,7 +26,7 @@ influxdb3_core: - What's my InfluxDB version? - How do I install and run InfluxDB 3 Core? - Help me write a plugin for the Python Processing engine using InfluxDB 3 Core - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"Core\", \"InfluxDB 3 Enterprise\", \"OSS v1\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_enterprise: @@ -73,7 +73,7 @@ influxdb3_explorer: - How do I install and run Explorer? - How do I query data using Explorer? - How do I visualize data using Explorer? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Explorer and Enterprise\", \"InfluxDB 3 Explorer and Core\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_serverless: @@ -103,7 +103,7 @@ influxdb3_cloud_serverless: - What's my InfluxDB version? - How do I migrate from Cloud (TSM) to Cloud Serverless? - What tools can I use to write data to InfluxDB Cloud Serverless? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB Cloud Serverless\", \"InfluxDB 3 Enterprise\", \"Core\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_cloud_dedicated: @@ -132,7 +132,7 @@ influxdb3_cloud_dedicated: - What's my InfluxDB version? - How do I migrate from InfluxDB v1 to Cloud Dedicated? - How do I use SQL and parameterized queries with InfluxDB Cloud Dedicated? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB Cloud Dedicated\", \"InfluxDB 3 Enterprise\", \"Core\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb3_clustered: @@ -161,7 +161,7 @@ influxdb3_clustered: - What's my InfluxDB version? - How do I use a Helm chart to configure InfluxDB Clustered? - How do I use SQL and parameterized queries with InfluxDB Clustered? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB Clustered\", \"InfluxDB 3 Enterprise\", \"Core\") for better results" ai_source_group_ids: "b650cf0b-4b52-42e8-bde7-a02738f27262" influxdb: @@ -201,7 +201,7 @@ influxdb: - What's my InfluxDB version? - How do I write and query data using InfluxDB OSS v2? - How can I migrate from InfluxDB OSS v2 to InfluxDB 3? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB OSS v2\", \"InfluxDB v1\", \"InfluxDB 3 Core\") for better results" ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" ai_sample_questions__v1: - What's my InfluxDB version? @@ -234,7 +234,7 @@ influxdb_cloud: - What's my InfluxDB version? - How do I write and query data using InfluxDB Cloud (TSM)? - How is Cloud (TSM) different from Cloud Serverless? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"InfluxDB Cloud (TSM)\", \"InfluxDB 3 Enterprise\", \"Core\") for better results" ai_source_group_ids: "3e905caa-dd6f-464b-abf9-c3880e09f128" telegraf: @@ -250,7 +250,7 @@ telegraf: - How do I configure Telegraf for InfluxDB 3? - How do I write a custom Telegraf plugin? - How do I use Telegraf for MQTT? - ai_input_placeholder: "Ask questions about Telegraf" + ai_input_placeholder: "Ask questions about Telegraf and InfluxDB" chronograf: name: Chronograf @@ -265,7 +265,7 @@ chronograf: - How do I configure Chronograf for InfluxDB v1? - How do I create a dashboard in Chronograf? - How do I use Grafana to visualize data stored in InfluxDB 3? - ai_input_placeholder: "Ask questions about Chronograf" + ai_input_placeholder: "Ask questions about Chronograf and InfluxDB" kapacitor: name: Kapacitor @@ -307,7 +307,7 @@ enterprise_influxdb: - What's my InfluxDB version? - How can I configure InfluxDB Enterprise v1? - How do I replicate data from OSS to InfluxDB Enterprise v1? - ai_input_placeholder: "Specify your version and product (\"InfluxDB 3 Enterprise\", \"Core\", \"Enterprise v1\") for better results" + ai_input_placeholder: "Specify your version and product (\"Enterprise v1\", \"InfluxDB 3 Enterprise\", \"Core\") for better results" ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f" flux: @@ -321,5 +321,5 @@ flux: - How do I query with Flux? - How do I transform data with Flux? - How do I join data with Flux? - ai_input_placeholder: "Ask questions about Flux" + ai_input_placeholder: "Ask questions about Flux and InfluxDB" ai_source_group_ids: "d809f67b-867d-4f17-95f0-c33dbadbf15f,3e905caa-dd6f-464b-abf9-c3880e09f128"