From 3486452dfbe6fb5b88386b5c558d2cf2ad4570ae Mon Sep 17 00:00:00 2001 From: Adam Tackett <105462877+TackAdam@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:29:58 -0700 Subject: [PATCH] GettingStarted Rework (#2194) * UI pass updating everything Signed-off-by: Adam Tackett * dashboard re-direct to integration for otel Signed-off-by: Adam Tackett * correct naming and icon for three cases Signed-off-by: Adam Tackett * updates to jsons and ndjsons Signed-off-by: Adam Tackett * remove dashboard creation from the create assets call Signed-off-by: Adam Tackett * update name to Self Managed Signed-off-by: Adam Tackett * Remove hyperlink from discover Signed-off-by: Adam Tackett * address comments Signed-off-by: Adam Tackett --------- Signed-off-by: Adam Tackett Co-authored-by: Adam Tackett (cherry picked from commit f68eba1c45920df2866875dd5542cfe805e3f241) --- common/constants/getting_started_routes.ts | 43 ++ .../components/getting_started.tsx | 40 +- .../getting_started_collectData.tsx | 651 +++++++++++------- .../getting_started_integrationCards.tsx | 178 ----- .../getting_started_queryAndAnalyze.tsx | 169 ----- .../csv_file/README.md | 38 - .../assets/fluent-bit-csv-upload-1.0.0.ndjson | 4 - .../csv_file/csv_file-1.0.0.json | 166 ----- .../csv_file/data/logs.csv | 10 - .../csv_file/getting-started/.env | 18 - .../getting-started/data-prepper/pipeline.yml | 20 - .../getting-started/docker-complete.yml | 58 -- .../csv_file/getting-started/fluent-bit.yml | 21 - .../fluent-bit/fluent-bit.conf | 28 - .../getting-started/fluent-bit/logs.csv | 10 - .../getting-started/fluent-bit/parsers.conf | 6 - .../csv_file/getting-started/logs/logs.csv | 10 - .../getting-started/opensearch_dashboards.yml | 10 - .../csv_file/info/Getting-Started.md | 189 ----- .../schema/csv-logs-1.0.0.mapping.json | 29 - .../csv_file/static/data-pepper.png | Bin 6990 -> 0 bytes .../fluent-bit-getting-started-dashboard.png | Bin 189875 -> 0 bytes .../csv_file/static/fluentbit.png | Bin 6693 -> 0 bytes .../csv_file/static/logo.png | Bin 17473 -> 0 bytes .../golang_client/golang_client-1.0.0.json | 77 +-- .../golang_client/static/logo.svg | 1 + .../java_client/java_client-1.0.0.json | 79 +-- .../java_client/static/logo.svg | 1 + .../nginx/nginx-1.0.0.json | 112 ++- .../otel-services-1.0.0-logs.json | 223 ++++++ .../otel-services-1.0.0-metrics.json | 230 +++++++ .../otel-services-1.0.0-traces.json | 263 +++++++ .../otel-services/otel-services-1.0.0.json | 293 -------- .../otel-services/static/logo.png | Bin 37516 -> 0 bytes .../otel-services/static/logo.svg | 1 + .../python_client/python_client-1.0.0.json | 73 +- public/components/getting_started/home.tsx | 7 + public/index.scss | 12 +- .../assets/fluent-bit-csv-upload-1.0.0.ndjson | 4 - .../assets/golang-tutorial-1.0.0.ndjson | 4 +- .../assets/java-tutorial-1.0.0.ndjson | 4 +- .../getting_started/assets/nginx-1.0.0.ndjson | 13 +- .../otel-index-patterns-1.0.0-Logs.ndjson | 2 + .../otel-index-patterns-1.0.0-Metrics.ndjson | 2 + .../otel-index-patterns-1.0.0-Traces.ndjson | 3 + .../assets/python-tutorial-1.0.0.ndjson | 4 +- .../getting_started/getting_started_router.ts | 49 +- server/routes/getting_started/helper.ts | 35 +- 48 files changed, 1281 insertions(+), 1909 deletions(-) create mode 100644 common/constants/getting_started_routes.ts delete mode 100644 public/components/getting_started/components/getting_started_integrationCards.tsx delete mode 100644 public/components/getting_started/components/getting_started_queryAndAnalyze.tsx delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/README.md delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/assets/fluent-bit-csv-upload-1.0.0.ndjson delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/csv_file-1.0.0.json delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/data/logs.csv delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/.env delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/data-prepper/pipeline.yml delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/docker-complete.yml delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit.yml delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/fluent-bit.conf delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/logs.csv delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/parsers.conf delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/logs/logs.csv delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/getting-started/opensearch_dashboards.yml delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/info/Getting-Started.md delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/schema/csv-logs-1.0.0.mapping.json delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/static/data-pepper.png delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/static/fluent-bit-getting-started-dashboard.png delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/static/fluentbit.png delete mode 100644 public/components/getting_started/getting_started_artifacts/csv_file/static/logo.png create mode 100644 public/components/getting_started/getting_started_artifacts/golang_client/static/logo.svg create mode 100644 public/components/getting_started/getting_started_artifacts/java_client/static/logo.svg create mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/otel-services-1.0.0-logs.json create mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/otel-services-1.0.0-metrics.json create mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/otel-services-1.0.0-traces.json delete mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/otel-services-1.0.0.json delete mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/static/logo.png create mode 100644 public/components/getting_started/getting_started_artifacts/otel-services/static/logo.svg delete mode 100644 server/routes/getting_started/assets/fluent-bit-csv-upload-1.0.0.ndjson create mode 100644 server/routes/getting_started/assets/otel-index-patterns-1.0.0-Logs.ndjson create mode 100644 server/routes/getting_started/assets/otel-index-patterns-1.0.0-Metrics.ndjson create mode 100644 server/routes/getting_started/assets/otel-index-patterns-1.0.0-Traces.ndjson diff --git a/common/constants/getting_started_routes.ts b/common/constants/getting_started_routes.ts new file mode 100644 index 000000000..7ecc233c6 --- /dev/null +++ b/common/constants/getting_started_routes.ts @@ -0,0 +1,43 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export type TutorialId = + | 'otelLogs' + | 'otelMetrics' + | 'otelTraces' + | 'nginx' + | 'java' + | 'python' + | 'golang'; + +export const COMPONENT_MAP: Record = { + otelLogs: 'otel-index-patterns', + otelMetrics: 'otel-index-patterns', + otelTraces: 'otel-index-patterns', + nginx: 'nginx', + java: 'java-tutorial', + python: 'python-tutorial', + golang: 'golang-tutorial', +}; + +export const VERSION_MAP: Record = { + otelLogs: '1.0.0', + otelMetrics: '1.0.0', + otelTraces: '1.0.0', + nginx: '1.0.0', + java: '1.0.0', + python: '1.0.0', + golang: '1.0.0', +}; + +export const SIGNAL_MAP: Record = { + otelLogs: 'Logs', + otelMetrics: 'Metrics', + otelTraces: 'Traces', + nginx: '', + java: '', + python: '', + golang: '', +}; diff --git a/public/components/getting_started/components/getting_started.tsx b/public/components/getting_started/components/getting_started.tsx index 5ebf856fc..944a21184 100644 --- a/public/components/getting_started/components/getting_started.tsx +++ b/public/components/getting_started/components/getting_started.tsx @@ -3,11 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiPage, EuiPageBody, EuiSpacer } from '@elastic/eui'; +import { EuiPage, EuiPageBody } from '@elastic/eui'; import React, { useEffect, useState } from 'react'; import { HomeProps } from 'public/components/getting_started/home'; import { CollectAndShipData } from './getting_started_collectData'; -import { QueryAndAnalyze } from './getting_started_queryAndAnalyze'; import { observabilityGettingStartedTitle } from '../../../../common/constants/shared'; interface ExtendedHomeProps extends HomeProps { @@ -17,10 +16,7 @@ interface ExtendedHomeProps extends HomeProps { export const NewGettingStarted = (props: ExtendedHomeProps) => { const { chrome, selectedDataSourceId, selectedDataSourceLabel } = props; - const [selectedSource, setSelectedSource] = useState(''); const [isPickYourSourceOpen, setIsPickYourSourceOpen] = useState(true); - const [isQueryDataOpen, setIsQueryDataOpen] = useState(false); - const [isSampleDataset, setIsSampleDataset] = useState(false); useEffect(() => { chrome.setBreadcrumbs([ @@ -31,28 +27,8 @@ export const NewGettingStarted = (props: ExtendedHomeProps) => { ]); }, [chrome]); - const handleSelectSource = (source: string) => { - setSelectedSource(source); - }; - const togglePickYourSource = (isOpen: boolean) => { setIsPickYourSourceOpen(isOpen); - if (isOpen) { - setIsQueryDataOpen(false); - } - }; - - const toggleQueryData = (isOpen: boolean) => { - setIsQueryDataOpen(isOpen); - }; - - const setQueryDataOpen = () => { - setIsPickYourSourceOpen(false); - setIsQueryDataOpen(true); - }; - - const handleCardSelectionChange = (isSample: boolean) => { - setIsSampleDataset(isSample); }; return ( @@ -61,23 +37,9 @@ export const NewGettingStarted = (props: ExtendedHomeProps) => { - - {!isSampleDataset && ( - - )} ); diff --git a/public/components/getting_started/components/getting_started_collectData.tsx b/public/components/getting_started/components/getting_started_collectData.tsx index 0d1de005a..0028486cc 100644 --- a/public/components/getting_started/components/getting_started_collectData.tsx +++ b/public/components/getting_started/components/getting_started_collectData.tsx @@ -4,8 +4,6 @@ */ import { - EuiAccordion, - EuiButton, EuiCheckableCard, EuiCodeBlock, EuiFlexGroup, @@ -14,36 +12,42 @@ import { EuiListGroup, EuiListGroupItem, EuiPanel, - EuiSelectable, EuiSpacer, EuiSteps, EuiText, EuiTitle, EuiTabbedContent, + EuiCompressedComboBox, + EuiButton, + EuiIcon, + EuiCard, } from '@elastic/eui'; import React, { useEffect, useState } from 'react'; -import csvFileJson from '../getting_started_artifacts/csv_file/csv_file-1.0.0.json'; import golangClientJson from '../getting_started_artifacts/golang_client/golang_client-1.0.0.json'; -import otelJson from '../getting_started_artifacts/otel-services/otel-services-1.0.0.json'; +import golangIcon from '../getting_started_artifacts/golang_client/static/logo.svg'; +import otelJsonLogs from '../getting_started_artifacts/otel-services/otel-services-1.0.0-logs.json'; +import otelJsonMetrics from '../getting_started_artifacts/otel-services/otel-services-1.0.0-metrics.json'; +import otelJsonTraces from '../getting_started_artifacts/otel-services/otel-services-1.0.0-traces.json'; +import otelIcon from '../getting_started_artifacts/otel-services/static/logo.svg'; import pythonJson from '../getting_started_artifacts/python_client/python_client-1.0.0.json'; +import pythonIcon from '../getting_started_artifacts/python_client/static/logo.png'; import nginxJson from '../getting_started_artifacts/nginx/nginx-1.0.0.json'; +import nginxIcon from '../getting_started_artifacts/nginx/static/logo.svg'; import javaJson from '../getting_started_artifacts/java_client/java_client-1.0.0.json'; +import javaIcon from '../getting_started_artifacts/java_client/static/logo.svg'; -import { IntegrationCards } from './getting_started_integrationCards'; -import { UploadAssets } from './utils'; +import { coreRefs } from '../../../../public/framework/core_refs'; +import { UploadAssets, fetchIndexPatternIds, redirectToDashboards } from './utils'; +import { getWorkspaceIdFromUrl } from '../../../../../../src/core/public/utils'; -const cardOne = 'Collector'; -const cardTwo = 'File Upload'; -const cardThree = 'Configure use-case based content'; +const cardOne = 'Logs'; +const cardTwo = 'Metrics'; +const cardThree = 'Traces'; interface CollectAndShipDataProps { isOpen: boolean; onToggle: (isOpen: boolean) => void; - selectedTechnology: string; - onMoveToQueryData: (indexPatterns: string[]) => void; - onSelectSource: (source: string) => void; - onCardSelectionChange: (isSampleDataset: boolean) => void; selectedDataSourceId: string; selectedDataSourceLabel: string; } @@ -54,11 +58,6 @@ interface CollectorOption { } export const CollectAndShipData: React.FC = ({ - isOpen, - onToggle, - onMoveToQueryData, - onSelectSource, - onCardSelectionChange, selectedDataSourceId, selectedDataSourceLabel, }) => { @@ -68,12 +67,13 @@ export const CollectAndShipData: React.FC = ({ const [selectedTabId, setSelectedTabId] = useState('workflow_0'); const [_selectedWorkflow, setSelectedWorkflow] = useState(''); const [workflows, setWorkflows] = useState([]); - const [selectedCard, setSelectedCard] = useState(''); const [collectorOptions, setCollectorOptions] = useState([]); + const [patternsContent, setPatternsContent] = useState([]); const technologyJsonMap: Record = { - otel: otelJson, - csv: csvFileJson, + otelLogs: otelJsonLogs, + otelMetrics: otelJsonMetrics, + otelTraces: otelJsonTraces, golang: golangClientJson, python: pythonJson, nginx: nginxJson, @@ -81,7 +81,27 @@ export const CollectAndShipData: React.FC = ({ }; useEffect(() => { - if (specificMethod) { + handleCollectionMethodChange(cardOne); + }, []); + + useEffect(() => { + let isMounted = true; + + const fetchPatterns = async () => { + try { + const content = await fetchIndexPatternIds(specificMethod); + if (isMounted) { + setPatternsContent(content.data.length !== 0 ? content.data : []); + } + } catch (error) { + console.error('Error fetching index patterns:', error); + if (isMounted) setPatternsContent([]); + } + }; + + if (specificMethod && isMounted) { + fetchPatterns(); + const json = technologyJsonMap[specificMethod]; if (json && json['getting-started']) { const fetchedWorkflows = json['getting-started'].workflows || []; @@ -95,179 +115,226 @@ export const CollectAndShipData: React.FC = ({ setGettingStarted(null); setWorkflows([]); } - } else { - setGettingStarted(null); - setWorkflows([]); } + + return () => { + isMounted = false; + }; }, [specificMethod]); + const handleSpecificMethodChange = (newOption: any) => { + const selectedOptionValue = newOption[0]?.value; + + if (selectedOptionValue === specificMethod) { + return; + } + + setSpecificMethod(selectedOptionValue); + setSelectedWorkflow(''); + setGettingStarted(null); + setWorkflows([]); + }; + + // Auto-select first collector if nothing is selected and a collection method is set + useEffect(() => { + if (collectorOptions.length > 0 && !specificMethod && collectionMethod) { + handleSpecificMethodChange([{ value: collectorOptions[0].value }]); + } + }, [collectorOptions, specificMethod, collectionMethod]); + const handleCollectionMethodChange = (value: string) => { setCollectionMethod(value); setSpecificMethod(''); setSelectedWorkflow(''); setGettingStarted(null); setWorkflows([]); - onCardSelectionChange(value === cardThree); if (value === cardOne) { setCollectorOptions([ - { label: 'Open Telemetry (structured)', value: 'otel' }, - { label: 'Nginx (structured)', value: 'nginx' }, - { label: 'Java (unstructured)', value: 'java' }, - { label: 'Python (unstructured)', value: 'python' }, - { label: 'Golang (unstructured)', value: 'golang' }, + { label: 'Open Telemetry', value: 'otelLogs' }, + { label: 'Nginx', value: 'nginx' }, + { label: 'Java', value: 'java' }, + { label: 'Python', value: 'python' }, + { label: 'Golang', value: 'golang' }, ]); } else if (value === cardTwo) { - setCollectorOptions([{ label: 'Fluent Bit', value: 'csv' }]); + setCollectorOptions([{ label: 'Open Telemetry', value: 'otelMetrics' }]); + } else if (value === cardThree) { + setCollectorOptions([{ label: 'Open Telemetry', value: 'otelTraces' }]); } }; - const handleSpecificMethodChange = (selectedOption: any) => { - if (!selectedOption) { - return; - } - const updatedOptions = collectorOptions.map((option) => - option.value === selectedOption.value - ? { ...option, checked: 'on' } - : { ...option, checked: undefined } + const renderSpecificMethodDropdown = () => { + if (!collectionMethod) return null; + + const iconMap: Record = { + golang: golangIcon, + otelLogs: otelIcon, + otelMetrics: otelIcon, + otelTraces: otelIcon, + python: pythonIcon, + nginx: nginxIcon, + java: javaIcon, + }; + + const optionsWithIcons = collectorOptions.map((option) => ({ + label: option.label, + value: option.value, + prepend: ( + {`${option.label} + ), + })); + + const selectedOption = optionsWithIcons.find((option) => option.value === specificMethod); + + return ( + <> + + Select telemetry source +
+ handleSpecificMethodChange(newOptions)} + renderOption={(option) => ( +
+ {option.prepend} + {option.label} +
+ )} + /> +
+ ); - setCollectorOptions(updatedOptions); - setSpecificMethod(selectedOption.value); - onSelectSource(selectedOption.value); - setSelectedWorkflow(''); - setGettingStarted(null); - setWorkflows([]); }; - const onTabClick = (tab: any) => { - const workflowIndex = parseInt(tab.id.split('_')[1], 10); - setSelectedTabId(tab.id); - setSelectedWorkflow(workflows[workflowIndex].name); - setGettingStarted(workflows[workflowIndex]); - }; + const renderIndexPatternStep = ( + patternsContentRender: any[], + selectedDataSourceIdRender: string + ) => { + if (!patternsContentRender || patternsContentRender.length === 0) return null; - const renderSpecificMethodDropdown = () => { - if (!collectionMethod) return null; + const handleIndexPatternClick = (patternId: string) => { + const finalPatternId = selectedDataSourceIdRender + ? `mds-${selectedDataSourceIdRender}-objectId-${patternId}` + : patternId; + + const currentUrl = window.location.href; + const workspaceId = getWorkspaceIdFromUrl(currentUrl, coreRefs?.http!.basePath.getBasePath()); + + const workspacePatternId = workspaceId + ? `workspaceId-${workspaceId}-${finalPatternId}` + : finalPatternId; + + coreRefs?.application!.navigateToApp('data-explorer', { + path: `discover#?_a=(discover:(columns:!(_source),isDirty:!f,sort:!()),metadata:(indexPattern:'${workspacePatternId}',view:discover))&_q=(filters:!(),query:(language:kuery,query:''))&_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))`, + }); + }; return ( <> -

Select a collector

+

Query your data in Discover to uncover insights

- - handleSpecificMethodChange(newOptions.find((option) => option.checked)) - } - listProps={{ bordered: true }} - > - {(list) => list} - + + {patternsContentRender.map((pattern) => ( + handleIndexPatternClick(pattern.id)} + style={{ display: 'inline-flex', alignItems: 'center', gap: '8px' }} + > + {pattern.title} + + + } + /> + ))} + ); }; - const renderSteps = (workflow: any) => { - const steps = workflow.steps.map((step: any) => ({ - title: step.name, - children: ( -
- {step.label && ( - -

{step.label}

-
- )} - {step.description} - {step['input-params'] && step['input-params'].length > 0 && ( -
- -

Input Parameters:

-
- {step['input-params'].map((param: any, idx: number) => ( - - {param.name}: {param.description} ({param.type}) - - ))} -
- )} - {step.info && - step.info.map((link: string, linkIndex: number) => ( - - More Info - - ))} - {step.content && ( + const renderSchema = (schemas: any[]) => + schemas.map((schema, idx) => { + const indexPatternName = schema['index-pattern-name'] || ''; + + return ( +
+ +

{schema.type} Schema

+
+ + {schema.description} +
+ {schema.alias && ( + <> + Alias: {schema.alias} +
+ + )} + {indexPatternName && ( + <> + Index Pattern Name: {indexPatternName} +
+ + )} + {Array.isArray(schema.info) && + schema.info.map((link: any, linkIdx: number) => + link && typeof link.url === 'string' ? ( + + {typeof link.title === 'string' && link.title.trim() !== '' + ? link.title + : 'More Info'} + + ) : ( + + Invalid URL + + ) + )} +
+ {schema.content && ( - {step.content} + {schema.content} )} + {schema['index-template'] && ( + + {`${indexPatternName} Index Template`} + + )}
- ), - })); - - steps.push({ - title: 'Schema', - children: renderSchema( - technologyJsonMap[specificMethod]?.['getting-started']?.schema || - technologyJsonMap[specificMethod]?.schema || - [] - ), - }); - - steps.push({ - title: 'Index Patterns', - children: renderIndex( - technologyJsonMap[specificMethod]?.['getting-started']?.['index-patterns'] || - technologyJsonMap[specificMethod]?.['index-patterns'] || - {} - ), + ); }); - return ; - }; - - const renderSchema = (schemas: any[]) => - schemas.map((schema, idx) => ( -
- -

{schema.type} Schema

-
- - {schema.description} -
- Alias: {schema.alias} -
- Index Pattern Name: {schema['index-pattern-name']} -
- {schema.info.map((infoLink: string, linkIdx: number) => ( - - More Info - - ))} -
- - {schema.content} - - - Index Template - - -
- )); - const renderIndex = (indexPatterns: any) => ( <> {indexPatterns?.description}
- {indexPatterns?.info?.map((infoLink: string, linkIdx: number) => ( - - More Info - - ))} + {Array.isArray(indexPatterns?.info) && + indexPatterns.info.map((link: any, linkIdx: number) => + link && typeof link.url === 'string' ? ( + + {typeof link.title === 'string' && link.title.trim() !== '' + ? link.title + : 'More Info'} + + ) : ( + + Invalid URL + + ) + )}
@@ -286,13 +353,144 @@ export const CollectAndShipData: React.FC = ({ > Create assets - - onMoveToQueryData(indexPatterns?.['index-patterns-name'] || [])}> - Move to query and analyze data - ); + const renderTechnologyDashboardCards = (specificMethodRender: string) => { + const baseUrl = `${window.location.origin}/app`; + + const cardData = { + nginx: { + title: 'Nginx Dashboard', + description: 'Analyze logs with pre-packaged dashboards', + icon: Nginx Icon, + url: `${baseUrl}/integrations#/available/nginx/setup`, + }, + }; + + const selectedCard = cardData[specificMethodRender]; + + if (!selectedCard) return null; + + return ( + + window.open(selectedCard.url, '_blank')}> + Install from Catalog + + } + /> + + ); + }; + + const renderVisualizeDataStep = () => { + return ( + + {renderTechnologyDashboardCards(specificMethod)} + + + } + title="Create a new dashboard" + description="Create a new dashboard to visualize your data" + footer={ + redirectToDashboards('dashboards')}> + Create a dashboard + + } + /> + + + ); + }; + + const renderSteps = (workflow: any) => { + const steps = [ + { + title: 'Schema', + children: renderSchema( + technologyJsonMap[specificMethod]?.['getting-started']?.schema || + technologyJsonMap[specificMethod]?.schema || + [] + ), + }, + { + title: 'Index Patterns', + children: renderIndex( + technologyJsonMap[specificMethod]?.['getting-started']?.['index-patterns'] || + technologyJsonMap[specificMethod]?.['index-patterns'] || + {} + ), + }, + ]; + + steps.push( + ...workflow.steps.map((step: any) => ({ + title: step.name, + children: ( +
+ {step.description} + {step['input-params'] && step['input-params'].length > 0 && ( +
+ +

Input Parameters:

+
+ {step['input-params'].map((param: any, idx: number) => ( + + {param.name}: {param.description} + + ))} +
+ )} + + {Array.isArray(step.info) && + step.info.map((link: any, linkIndex: number) => { + if (link && typeof link.url === 'string') { + return ( + + {typeof link.title === 'string' && link.title.trim() !== '' + ? link.title + : 'More Info'} + + ); + } else { + return ( + + Invalid URL + + ); + } + })} + + {step.content && ( + + {step.content} + + )} + +
+ ), + })) + ); + + steps.push({ + title: 'Explore your data', + children: renderIndexPatternStep(patternsContent, selectedDataSourceId), + }); + + steps.push({ + title: 'Visualize your data', + children: renderVisualizeDataStep(), + }); + + return ; + }; + const tabs = workflows.map((workflow, index) => ({ id: `workflow_${index}`, name: workflow.name, @@ -306,83 +504,68 @@ export const CollectAndShipData: React.FC = ({ return ( - - -

Collection method

-
- - - - { - handleCollectionMethodChange(cardOne); - setSelectedCard(cardOne); - }} - > - Configure agents and ingestion pipeline - - - - { - handleCollectionMethodChange(cardTwo); - setSelectedCard(cardTwo); - }} - > - Upload your data - - - - { - handleCollectionMethodChange(cardThree); - setSelectedCard(cardThree); - }} - > - Explore with a log dataset - - - - - {collectionMethod === cardThree ? ( - - ) : ( - <> - {renderSpecificMethodDropdown()} - - {specificMethod && ( - <> - - {tabs.length > 0 && ( - tab.id === selectedTabId)} - onTabClick={onTabClick} - /> - )} - - )} - - )} -
+ + + + { + handleCollectionMethodChange(cardOne); + }} + /> + + + { + handleCollectionMethodChange(cardTwo); + }} + /> + + + { + handleCollectionMethodChange(cardThree); + }} + /> + + + + {renderSpecificMethodDropdown()} + + {specificMethod && ( + <> + + {tabs.length > 0 && ( + <> + +

+ Steps to integrate{' '} + {specificMethod.startsWith('otel') + ? 'OpenTelemetry' + : specificMethod.charAt(0).toUpperCase() + specificMethod.slice(1)}{' '} + {collectionMethod.toLowerCase()} +

+
+ tab.id === selectedTabId)} + onTabClick={(tab) => setSelectedTabId(tab.id)} + /> + + )} + + )}
); }; diff --git a/public/components/getting_started/components/getting_started_integrationCards.tsx b/public/components/getting_started/components/getting_started_integrationCards.tsx deleted file mode 100644 index 360060e56..000000000 --- a/public/components/getting_started/components/getting_started_integrationCards.tsx +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { - EuiBadge, - EuiCard, - EuiFieldSearch, - EuiFilterButton, - EuiFilterGroup, - EuiFilterSelectItem, - EuiFlexGroup, - EuiFlexItem, - EuiPopover, - EuiPopoverTitle, - EuiSpacer, - EuiText, -} from '@elastic/eui'; -import React, { useEffect, useState } from 'react'; -import { observabilityIntegrationsID } from '../../../../common/constants/shared'; -import { coreRefs } from '../../../../public/framework/core_refs'; - -export const IntegrationCards = () => { - const [integrationData, setIntegrationData] = useState([]); - const [loading, setLoading] = useState(true); - const [query, setQuery] = useState(''); - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const [items, setItems] = useState([] as Array<{ name: string; checked: boolean }>); - - useEffect(() => { - async function fetchIntegrationData() { - try { - const response = await coreRefs.http!.get(`/api/integrations/repository`); - const data = response.data.hits; - setIntegrationData(data); - const categories = Array.from(new Set(data.flatMap((item: any) => item.labels ?? []))); - setItems(categories.map((name) => ({ name, checked: false }))); - } catch (error) { - console.error('Error fetching integration data:', error); - } finally { - setLoading(false); - } - } - fetchIntegrationData(); - }, []); - - const updateItem = (index: number) => { - if (!items[index]) { - return; - } - const newItems = [...items]; - newItems[index].checked = !items[index].checked; - setItems(newItems); - }; - - const renderFilters = () => { - const button = ( - setIsPopoverOpen(!isPopoverOpen)} - isSelected={isPopoverOpen} - numFilters={items.length} - hasActiveFilters={!!items.find((item) => item.checked)} - numActiveFilters={items.filter((item) => item.checked).length} - > - Categories - - ); - - return ( - - - setQuery(e.target.value)} - /> - - - - setIsPopoverOpen(false)} - panelPaddingSize="none" - > - - - -
- {items.map((item, index) => ( - updateItem(index)} - > - {item.name} - - ))} -
-
-
-
-
- ); - }; - - const filteredHits = integrationData.filter( - (hit) => - (!query || hit.name.toLowerCase().includes(query.toLowerCase())) && - items.filter((item) => item.checked).every((item) => hit.labels?.includes(item.name)) - ); - - const renderIntegrationCards = () => { - if (loading) { - return Loading...; - } - - if (filteredHits.length === 0) { - return ( - -

No integrations available

-

There are no integrations available at this time.

-
- ); - } - - return ( - - {filteredHits.map((integration, index) => ( - - - ) : ( -
- ) - } - title={integration.displayName || integration.name} - description={integration.description} - data-test-subj={`integration_card_${integration.name.toLowerCase()}`} - titleElement="span" - onClick={() => - coreRefs?.application?.navigateToApp(observabilityIntegrationsID, { - path: `#/available/${integration.name}`, - }) - } - footer={ -
- {integration.labels && - integration.labels.map((label: string, idx: number) => ( - {label} - ))} -
- } - /> - - ))} - - ); - }; - - return ( - <> - {renderFilters()} - - {renderIntegrationCards()} - - ); -}; diff --git a/public/components/getting_started/components/getting_started_queryAndAnalyze.tsx b/public/components/getting_started/components/getting_started_queryAndAnalyze.tsx deleted file mode 100644 index f6c5a0e93..000000000 --- a/public/components/getting_started/components/getting_started_queryAndAnalyze.tsx +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import React, { useEffect, useState } from 'react'; -import { - EuiAccordion, - EuiButton, - EuiCard, - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiPanel, - EuiSpacer, - EuiText, -} from '@elastic/eui'; -import { coreRefs } from '../../../../public/framework/core_refs'; -import { fetchDashboardIds, fetchIndexPatternIds, redirectToDashboards } from './utils'; -import { getWorkspaceIdFromUrl } from '../../../../../../src/core/public/utils'; - -interface Pattern { - id: string; - title: string; -} - -interface Dashboard { - id: string; - title: string; -} - -interface QueryAndAnalyzeProps { - isOpen: boolean; - onToggle: (isOpen: boolean) => void; - selectedTechnology: string; - selectedDataSourceId: string; - selectedDataSourceLabel: string; -} - -export const QueryAndAnalyze: React.FC = ({ - isOpen, - onToggle, - selectedTechnology, - selectedDataSourceId, -}) => { - const [patternsContent, setPatternsContent] = useState([]); - const [dashboardsContent, setDashboardsContent] = useState([]); - - const fetchIndexPatternContent = async () => { - try { - const content = await fetchIndexPatternIds(selectedTechnology); - setPatternsContent(content.data.length !== 0 ? content.data : []); - } catch (error) { - console.error('Error fetching index patterns:', error); - setPatternsContent([]); - } - - try { - const content = await fetchDashboardIds(selectedTechnology); - setDashboardsContent(content.data.length !== 0 ? content.data : []); - } catch (error) { - console.error('Error fetching dashboards:', error); - setDashboardsContent([]); - } - }; - - useEffect(() => { - if (selectedTechnology !== '') { - fetchIndexPatternContent(); - } - }, [selectedTechnology, selectedDataSourceId]); - - const handleIndexPatternClick = (patternId: string) => { - const finalPatternId = selectedDataSourceId - ? `mds-${selectedDataSourceId}-objectId-${patternId}` - : patternId; - - const currentUrl = window.location.href; - const workspaceId = getWorkspaceIdFromUrl(currentUrl, coreRefs?.http!.basePath.getBasePath()); - - const workspacePatternId = workspaceId - ? `workspaceId-${workspaceId}-${finalPatternId}` - : finalPatternId; - - coreRefs?.application!.navigateToApp('data-explorer', { - path: `discover#?_a=(discover:(columns:!(_source),isDirty:!f,sort:!()),metadata:(indexPattern:'${workspacePatternId}',view:discover))&_q=(filters:!(),query:(language:kuery,query:''))&_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))`, - }); - }; - - const redirectToDashboardsMDS = (dashboardId: string) => { - const finalDashboardId = selectedDataSourceId - ? `mds-${selectedDataSourceId}-objectId-${dashboardId}` - : dashboardId; - - const currentUrl = window.location.href; - const workspaceId = getWorkspaceIdFromUrl(currentUrl, coreRefs?.http!.basePath.getBasePath()); - - const workspaceDashboardId = workspaceId - ? `workspaceId-${workspaceId}-${finalDashboardId}` - : finalDashboardId; - const dashboardUrl = `#/view/${workspaceDashboardId}`; - - coreRefs?.application!.navigateToApp('dashboards', { - path: dashboardUrl, - }); - }; - - return ( - - - -

-

Explore your data

-

-
- - - {patternsContent.length !== 0 && - patternsContent.map((pattern) => ( - - handleIndexPatternClick(pattern.id)}> - {pattern.title} - - - ))} - - - -

-

Visualize your data

-

-
- - - {dashboardsContent.length !== 0 && - dashboardsContent.map((dashboard) => ( - - } - title={dashboard.title} - description={`Explore the ${dashboard.title} dashboard`} - onClick={() => { - redirectToDashboardsMDS(dashboard.id); - }} - /> - - ))} - - - } - title="Create New Dashboard" - description="Create a new dashboard to visualize your data" - onClick={() => { - redirectToDashboards('dashboards'); - }} - /> - - -
-
- ); -}; diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/README.md b/public/components/getting_started/getting_started_artifacts/csv_file/README.md deleted file mode 100644 index d20db8315..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# CSV Upload Integration - -> CSV File based Upload Integration - -## What is CSV Upload ? - -CSV upload is an example of parsing and loading a CSV file into opensearch index using an agent - -## What is CSV Integration ? - -An integration is a bundle of pre-canned assets which are bundled togather in a meaningful manner. - -**_CSV Upload_** integration includes docker live example including getting started instruction of using data-prepper or fluent-bit for -uploading the csv file into a dedicated index using a parser to transform the csv into json - -## Ingesting CVS Using Data-Prepper - ... - -## Ingesting CVS Using Flunet-Bit - -... - ---- -## Loading Integrations via DashboardManagement - -To update an integration template navigate to the DashboardManagement and select [savedObjects](https://localhost:5601/_dashboards/app/management/opensearch-dashboards/objects) and import the new artifact: - -1) Download the `nginx-1.0.0.ndjson` artifact from the [catalog release page](https://github.com/opensearch-project/opensearch-catalog/releases/edit/nginx-1.0.0) - -2) Go to the [DashboardManagement -> savedObjects ](https://localhost:5601/_dashboards/app/management/opensearch-dashboards/objects) - -![](https://github.com/opensearch-project/opensearch-catalog/assets/48943349/d96e9a78-e3de-4cce-ba66-23f7c084778d) - -![](https://github.com/opensearch-project/opensearch-catalog/assets/48943349/a63ae102-706a-4980-b758-fff7f6b24a94) - -3) Once there select import to load the recently downloaded integration artifact (`nginx-1.0.0.ndjson` suffix) - -4) Open the [nginx integration](https://localhost:5601/app/integrations#/available/nginx) and install diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/assets/fluent-bit-csv-upload-1.0.0.ndjson b/public/components/getting_started/getting_started_artifacts/csv_file/assets/fluent-bit-csv-upload-1.0.0.ndjson deleted file mode 100644 index ecdfad483..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/assets/fluent-bit-csv-upload-1.0.0.ndjson +++ /dev/null @@ -1,4 +0,0 @@ -{"attributes":{"description":"upload a csv file example using fluent-bit agent","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"fluent-bit-csv-upload","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"fluent-bit-csv-upload\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":12,\"openLinksInNewTab\":false,\"markdown\":\"# Uploading a CSV File into an OpenSearch Index Using Fluent Bit\\n\\nThis tutorial will guide you through the process of setting up Fluent Bit to monitor a directory for CSV files and upload their contents into an OpenSearch index.\\n\\n## Prerequisites\\n\\n- An OpenSearch instance running and accessible.\\n- Fluent Bit installed on your system.\\n- A directory containing your CSV files.\\n\\n## Step 1: Install Fluent Bit\\n\\n### On Linux:\\n\\n```bash\\ncurl -L https://fluentbit.io/releases/1.8/fluent-bit-1.8.11-linux-x86_64.tar.gz -o fluent-bit.tar.gz\\ntar -xvf fluent-bit.tar.gz\\ncd fluent-bit/bin\\n```\\n\\n### On macOS:\\n\\n```bash\\nbrew install fluent-bit\\n```\\n\\n### On Windows:\\n\\nDownload and extract Fluent Bit from [Fluent Bit releases](https://fluentbit.io/download/).\\n\\n## Step 2: Create Fluent Bit Configuration Files\\n\\n#### Create `fluent-bit.conf`\\n\\nThis is the main configuration file for Fluent Bit. It defines the input source, parser, and output destination.\\n\\n```ini\\n[SERVICE]\\n Flush 1\\n Log_Level info\\n Parsers_File parsers.conf\\n\\n[INPUT]\\n Name tail\\n Path /path/to/your/csv/files/*.csv\\n Parser csv\\n Tag csv\\n Refresh_Interval 5\\n Rotate_Wait 30\\n\\n[OUTPUT]\\n Name opensearch\\n Match *\\n Host your-opensearch-host\\n Port 9200\\n Index csv-index\\n HTTP_User your-username\\n HTTP_Passwd your-password\\n tls off\\n Suppress_Type_Name On\\n tls.verify off\\n```\\n\\n### Create `parsers.conf`\\n\\nThis file defines the CSV parser.\\n\\n```ini\\n[PARSER]\\n Name csv\\n Format regex\\n Regex ^(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+)$\\n Time_Key timestamp\\n Time_Format %Y-%m-%d %H:%M:%S\\n```\\n\\n### Direct the CSV folder location\\n\\nEnsure this file is in the directory you specified in the `Path` of the `fluent-bit.conf` file.\\n\\n\\n## Step 3: Run Fluent Bit\\n\\nNavigate to the directory containing the Fluent Bit executable and the configuration files. Then, start Fluent Bit with the configuration files.\\n\\n```bash\\n/path/to/fluent-bit/bin/fluent-bit -c /path/to/fluent-bit.conf\\n```\\n\\n## Step 4: Verify Data in OpenSearch\\n\\nAfter starting Fluent Bit, you can verify the data ingestion by accessing OpenSearch and searching for the `csv-index` index.\\n\\nFor example, you can use OpenSearch Dashboards or the OpenSearch API to query the index:\\n\\n### Using OpenSearch Dashboards:\\n\\n1. Open OpenSearch Dashboards in your browser.\\n2. Navigate to the \\\"Discover\\\" tab.\\n3. Select the `csv-index` index pattern.\\n4. Verify that the log data from your CSV files is being ingested and displayed.\\n\\n### Using the OpenSearch API:\\n\\n```bash\\ncurl -X GET \\\"http://your-opensearch-host:9200/csv-index/_search?pretty\\\"\\n```\\n\\n---\\n## Live Testing with Docker Compose\\nIf you prefer to test this setup using Docker Compose, you can use the following docker-compose.yml file to quickly set up an OpenSearch instance along with Fluent Bit:\\n\\nUnder the `getting-started` section you can examine a live docker-compose sample:\\n```yaml\\n/csv_file/getting-started/fluent-bit\\n|-- docker-complete.yml\\n|-- data/\\n |-- fluent-bit.conf\\n |-- parsers.conf\\n |-- logs.csv\\n\\n```\\nUse the [docker-compose](../getting-started/fluent-bit/docker-complete.yml) you can find a complete:\\n\\n`docker compose -f docker-complete.yml up -d` would instantiate the services and start sending the csv sample logs into an index. \\n\"}}"},"id":"0fad8910-43d9-11ef-a69e-0549ba61487e","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2024-07-17T16:55:31.713Z","version":"WzEsMV0="} -{"attributes":{"description":"upload a csv file example using fluent-bit agent","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"2.15.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"22a1a11f-7ecf-46c7-a73d-b6cb5eb07b45\"},\"panelIndex\":\"22a1a11f-7ecf-46c7-a73d-b6cb5eb07b45\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"}]","timeRestore":false,"title":"csv-file-upload-fluent-bit-dashboard","version":1},"id":"1e4f1c40-43d9-11ef-a69e-0549ba61487e","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"0fad8910-43d9-11ef-a69e-0549ba61487e","name":"panel_0","type":"visualization"}],"type":"dashboard","updated_at":"2024-07-17T16:55:31.713Z","version":"WzIsMV0="} -{"attributes":{"fields":"[{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"application\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"application.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"application\"}}},{\"count\":0,\"name\":\"host\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"host.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"host\"}}},{\"count\":0,\"name\":\"log_level\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"log_level.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"log_level\"}}},{\"count\":0,\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"message.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"message\"}}},{\"count\":0,\"name\":\"timestamp\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"timestamp.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"timestamp\"}}}]","timeFieldName":"@timestamp","title":"logs-*"},"id":"csv-getting-started-tutorial-1.0.0","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-17T16:59:06.006Z","version":"WzMsMV0="} -{"exportedCount":3,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/csv_file-1.0.0.json b/public/components/getting_started/getting_started_artifacts/csv_file/csv_file-1.0.0.json deleted file mode 100644 index f69be8f6c..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/csv_file-1.0.0.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "name": "csv", - "version": "1.0.0", - "displayName": "csv-file", - "description": "Upload a CSV file", - "license": "Apache-2.0", - "type": "logs", - "labels": ["Logs", "Unstructured"], - "author": "OpenSearch", - "sourceUrl": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file", - "workflows": [ - { - "name": "dashboards", - "label": "Dashboards & Visualizations", - "description": "Dashboards and indices that enable you to easily visualize important metrics.", - "enabled_by_default": false - } - ], - "statics": { - "logo": { - "annotation": "CSV Logo", - "path": "logo.svg" - }, - "gallery": [ - { - "annotation": "Fluent-Bit getting started tutorial", - "path": "fluent-bit-getting-started-dashboard.png", - "tags":["dashboard","tutorial"], - "savedObject-id": "csv-getting-started-tutorial-1.0.0" - }, - { - "annotation": "Data-Prepper Logo", - "path": "data-pepper.png" - }, - { - "annotation": "Fluent-Bit Logo", - "path": "fluentbit.png" - } - ] - }, - "components": [], - "getting-started": { - "info": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/getting-started/Getting-Started.md", - "ingestion": ["fluent-bit","data-prepper"], - "structured": "true", - "technology": "csv", - "protocol": [], - "live-sample": "true", - "workflows": [ - { - "name": "QuickStart", - "description": "This is a docker-composed based getting started live example with CSV file upload", - "steps": [ - { - "name": "Create docker-network", - "label": "Environment setting", - "phase": "docker", - "type": "console-cmd", - "content": "docker network create opensearch-net", - "description": "Before running any docker-compose files, create the opensearch-net network" - }, - { - "name": "Setup docker .env file", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "input-params": [ - { - "name": "OPENSEARCH_HOST", - "description": "Opensearch host", - "type": "host-name" - }, - { - "name": "OPENSEARCH_DASHBOARD_HOST", - "description": "Opensearch Dashboard host", - "type": "host-name" - } - ], - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/getting-started/.env"], - "content": "wget https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/csv_file/getting-started/.env", - "description": "Setup docker-compose env variables " - }, - { - "name": "Setup fluent-bit folder", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "info": ["https://github.com/opensearch-project/opensearch-catalog/tree/main/integrations/observability/csv_file/getting-started/fluent-bit/fluent-bit.conf", - "https://github.com/opensearch-project/opensearch-catalog/tree/main/integrations/observability/csv_file/getting-started/fluent-bit/parsers.conf" - ], - "content": "mkdir -p fluent-bit\nwget -P fluent-bit https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/csv_file/getting-started/fluent-bit/fluent-bit.conf \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/csv_file/getting-started/fluent-bit/parsers.conf\n", - "description": "Setup docker-compose fluent-bit's service configuration " - }, - { - "name": "Run docker-compose", - "label": "live container", - "type": "file-url", - "phase": "docker", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/getting-started/docker-compose.yml"], - "description": "Run docker-compose for the nginx live example and see the generated index", - "content": "wget -O docker-compose.yml https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/csv_file/getting-started/docker-compose.yml && docker-compose up -d fluent-bit \n" - } - ] - }, - { - "name": "Fluent-bit file upload", - "description": "This is a fluent-bit based CSV file upload getting started instructions tutorial", - "steps": [ - { - "name": "Fluent-Bit Parser", - "type": "console-cmd", - "phase": "ingestion", - "label": "Log Parsing", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/getting-started/fluent-bit/parsers.conf"], - "description": "Setup Fluent-Bit parser config file parsing csv file", - "content": "[PARSER]\n Name csv\n Format regex\n Regex ^(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+)$\n Time_Key timestamp\n Time_Format %Y-%m-%d %H:%M:%S\n" - }, - { - "name": "Fluent-Bit Setup", - "type": "console-cmd", - "phase": "ingestion", - "label": "Agent Set-Up", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/getting-started/fluent-bit/fluent-bit.conf"], - "description": "Setup Fluent-Bit conf file including logs parsing and OpenSearch access", - "input-params": [ - { - "name": "opensearch-node1", - "description": "Opensearch host", - "type": "host-name" - }, - { - "name": "ss4o_logs-nginx-prod", - "description": "logs sink index name", - "type": "index-name" - } - ], - "content": "[SERVICE]\n Flush 1\n Log_Level info\n Parsers_File parsers.conf\n\n[INPUT]\n Name tail\n Path /fluent-bit/data/*.csv\n Parser csv\n Tag csv\n\n[INPUT]\n Name dummy\n Dummy {\"timestamp\":\"2024-07-16 12:09:00\", \"log_level\":\"INFO\", \"message\":\"Dummy log message\", \"application\":\"App2\", \"host\":\"host2\"}\n Tag dummy\n\n[OUTPUT]\n Name opensearch\n Host opensearch-node1\n Match *\n Port 9200\n Type _doc\n Index logs-index\n tls On\n tls.verify Off\n Suppress_Type_Name On\n HTTP_User admin\n HTTP_Passwd my_%New%_passW0rd!@#" - } - ] - } - ], - "schema": [ - { - "type": "csv-logs", - "info": ["https://opensearch.org/docs/latest/im-plugin/index-templates"], - "content": "PUT _index_template/csv_logs_template", - "description": "Setup sample csv based schema logs index template in the dev console", - "index-template": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/schema/csv-logs-1.0.0.mapping.json", - "index-pattern-name": "logs-*" - } - ], - "index-patterns": { - "type": ["logs"], - "info": ["https://opensearch.org/docs/latest/dashboards/management/index-patterns/"], - "description": "Import index patterns `.ndjson` file to the saved objects", - "index-pattern": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/csv_file/assets/fluent-bit-csv-upload-1.0.0.ndjson", - "index-patterns-name": ["logs-*"] - } - }, - "assets": [ - { "name": "fluent-bit-csv-upload", "version": "1.0.0", "extension": "ndjson", "type": "savedObjectBundle", "workflows": ["dashboards"] } - ], - "sampleData": { - "path": "logs.csv" - } -} diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/data/logs.csv b/public/components/getting_started/getting_started_artifacts/csv_file/data/logs.csv deleted file mode 100644 index d0136c721..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/data/logs.csv +++ /dev/null @@ -1,10 +0,0 @@ -2024-07-16 12:00:00,INFO,Application started successfully,App1,host1 -2024-07-16 12:01:00,DEBUG,User logged in,App1,host1 -2024-07-16 12:01:05,ERROR,Failed to load resource,App1,host1 -2024-07-16 12:02:00,WARN,Deprecated API used,App1,host1 -2024-07-16 12:03:00,INFO,Background job executed,App1,host1 -2024-07-16 12:04:00,DEBUG,Cache cleared,App1,host1 -2024-07-16 12:05:00,INFO,User logged out,App1,host1 -2024-07-16 12:06:00,ERROR,Database connection failed,App1,host1 -2024-07-16 12:07:00,INFO,Application shutdown initiated,App1,host1 -2024-07-16 12:08:00,INFO,Application shutdown completed,App1,host1 diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/.env b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/.env deleted file mode 100644 index 60ee804eb..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/.env +++ /dev/null @@ -1,18 +0,0 @@ -# Nginx Proxy -NGINX_PORT=90 -NGINX_ADDR=nginx:${NGINX_PORT} - -# OpenSearch version -OPENSEARCH_VERSION=2.15.0 -OPENSEARCH_ADMIN_PASSWORD=my_%New%_passW0rd!@# -OPENSEARCH_INITIAL_ADMIN_PASSWORD=my_%New%_passW0rd!@# - -# OpenSearch Node1 -OPENSEARCH_PORT=9200 -OPENSEARCH_HOST=opensearch -OPENSEARCH_ADDR=${OPENSEARCH_HOST}:${OPENSEARCH_PORT} - -# OpenSearch Dashboard -OPENSEARCH_DASHBOARD_PORT=5601 -OPENSEARCH_DASHBOARD_HOST=opensearch-dashboards -OPENSEARCH_DASHBOARD_ADDR=${OPENSEARCH_DASHBOARD_HOST}:${OPENSEARCH_DASHBOARD_PORT} diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/data-prepper/pipeline.yml b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/data-prepper/pipeline.yml deleted file mode 100644 index fdd41819d..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/data-prepper/pipeline.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -csv-pipeline: - source: - file: - path: "/full/path/to/ingest.csv" - record_type: "event" - processor: - - csv: - column_names: ["col1", "col2", "col3"] - sink: - - opensearch: - hosts: ["https://opensearch-node1:9200"] - username: "admin" - password: "my_%New%_passW0rd!@#" - insecure: true - index_type: custom - index: logs-index - bulk_size: 4 diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/docker-complete.yml b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/docker-complete.yml deleted file mode 100644 index 582f5f52d..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/docker-complete.yml +++ /dev/null @@ -1,58 +0,0 @@ -version: '3.8' - -services: - opensearch-dashboards: - image: opensearchproject/opensearch-dashboards:${OPENSEARCH_VERSION} - container_name: opensearch-dashboards - ports: - - 5601:5601 - environment: - OPENSEARCH_HOSTS: '["https://opensearch-node1:9200"]' - depends_on: - - opensearch-node1 - volumes: - - ./opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml - networks: - - opensearch-net - - opensearch-node1: - image: opensearchproject/opensearch:${OPENSEARCH_VERSION} - container_name: opensearch-node1 - environment: - - cluster.name=my-cluster - - node.name=opensearch-node1 - - discovery.seed_hosts=opensearch-node1 - - cluster.initial_master_nodes=opensearch-node1 - - bootstrap.memory_lock=true - - plugins.query.datasources.encryption.masterkey=8e3f206ea7c07cc1bfc5cf40 - - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" - - "OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_ADMIN_PASSWORD}" - ulimits: - memlock: - soft: -1 - hard: -1 - volumes: - - opensearch-data:/usr/share/opensearch/data - ports: - - 9200:9200 - - 9600:9600 - networks: - - opensearch-net - - fluent-bit: - container_name: fluent-bit - volumes: - - ./logs:/logs - - ./fluent-bit:/fluent-bit/etc - ports: - - "24224:24224" - - "24224:24224/udp" - networks: - - opensearch-net - -volumes: - opensearch-data: - -networks: - opensearch-net: - driver: bridge diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit.yml b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit.yml deleted file mode 100644 index 16f95f8b3..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: '3.8' - -services: - fluent-bit: - container_name: fluent-bit - image: fluent/fluent-bit:latest - volumes: - - ./logs:/logs - - ./fluent-bit:/fluent-bit/etc - ports: - - "24224:24224" - - "24224:24224/udp" - networks: - - opensearch-net - -volumes: - opensearch-data: - -networks: - opensearch-net: - driver: bridge diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/fluent-bit.conf b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/fluent-bit.conf deleted file mode 100644 index 9a23d90c7..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/fluent-bit.conf +++ /dev/null @@ -1,28 +0,0 @@ -[SERVICE] - Flush 1 - Log_Level info - Parsers_File parsers.conf - -[INPUT] - Name tail - Path *.csv - Parser csv - Tag csv - -[INPUT] - Name dummy - Dummy {"timestamp":"2024-07-16 12:09:00", "log_level":"INFO", "message":"Dummy log message", "application":"App2", "host":"host2"} - Tag dummy - -[OUTPUT] - Name opensearch - Host opensearch-node1 - Match * - Port 9200 - Type _doc - Index logs-index - tls On - tls.verify Off - Suppress_Type_Name On - HTTP_User admin - HTTP_Passwd my_%New%_passW0rd!@# diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/logs.csv b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/logs.csv deleted file mode 100644 index d0136c721..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/logs.csv +++ /dev/null @@ -1,10 +0,0 @@ -2024-07-16 12:00:00,INFO,Application started successfully,App1,host1 -2024-07-16 12:01:00,DEBUG,User logged in,App1,host1 -2024-07-16 12:01:05,ERROR,Failed to load resource,App1,host1 -2024-07-16 12:02:00,WARN,Deprecated API used,App1,host1 -2024-07-16 12:03:00,INFO,Background job executed,App1,host1 -2024-07-16 12:04:00,DEBUG,Cache cleared,App1,host1 -2024-07-16 12:05:00,INFO,User logged out,App1,host1 -2024-07-16 12:06:00,ERROR,Database connection failed,App1,host1 -2024-07-16 12:07:00,INFO,Application shutdown initiated,App1,host1 -2024-07-16 12:08:00,INFO,Application shutdown completed,App1,host1 diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/parsers.conf b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/parsers.conf deleted file mode 100644 index 056a359d0..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/fluent-bit/parsers.conf +++ /dev/null @@ -1,6 +0,0 @@ -[PARSER] - Name csv - Format regex - Regex ^(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+)$ - Time_Key timestamp - Time_Format %Y-%m-%d %H:%M:%S diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/logs/logs.csv b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/logs/logs.csv deleted file mode 100644 index d0136c721..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/logs/logs.csv +++ /dev/null @@ -1,10 +0,0 @@ -2024-07-16 12:00:00,INFO,Application started successfully,App1,host1 -2024-07-16 12:01:00,DEBUG,User logged in,App1,host1 -2024-07-16 12:01:05,ERROR,Failed to load resource,App1,host1 -2024-07-16 12:02:00,WARN,Deprecated API used,App1,host1 -2024-07-16 12:03:00,INFO,Background job executed,App1,host1 -2024-07-16 12:04:00,DEBUG,Cache cleared,App1,host1 -2024-07-16 12:05:00,INFO,User logged out,App1,host1 -2024-07-16 12:06:00,ERROR,Database connection failed,App1,host1 -2024-07-16 12:07:00,INFO,Application shutdown initiated,App1,host1 -2024-07-16 12:08:00,INFO,Application shutdown completed,App1,host1 diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/opensearch_dashboards.yml b/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/opensearch_dashboards.yml deleted file mode 100644 index e386ddbc1..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/getting-started/opensearch_dashboards.yml +++ /dev/null @@ -1,10 +0,0 @@ -opensearch.hosts: ["https://opensearch-node1:9200"] -server.host: 0.0.0.0 -opensearch.ssl.verificationMode: none -opensearch.username: "admin" -opensearch.password: "my_%New%_passW0rd!@#" -opensearch.requestHeadersWhitelist: [ authorization,securitytenant ] -opensearch_security.multitenancy.enabled: false -opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] -opensearch_security.readonly_mode.roles: ["kibana_read_only"] -vis_type_vega.enableExternalUrls: true diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/info/Getting-Started.md b/public/components/getting_started/getting_started_artifacts/csv_file/info/Getting-Started.md deleted file mode 100644 index 344b66f84..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/info/Getting-Started.md +++ /dev/null @@ -1,189 +0,0 @@ -# Uploading a CSV File into an OpenSearch Index Using Fluent Bit - -This tutorial will guide you through the process of setting up Fluent Bit to monitor a directory for CSV files and upload their contents into an OpenSearch index. - -## Prerequisites - -- An OpenSearch instance running and accessible. -- Fluent Bit installed on your system. -- A directory containing your CSV files. - -## Step 1: Install Fluent Bit - -### On Linux: - -```bash -curl -L https://fluentbit.io/releases/1.8/fluent-bit-1.8.11-linux-x86_64.tar.gz -o fluent-bit.tar.gz -tar -xvf fluent-bit.tar.gz -cd fluent-bit/bin -``` - -### On macOS: - -```bash -brew install fluent-bit -``` - -### On Windows: - -Download and extract Fluent Bit from [Fluent Bit releases](https://fluentbit.io/download/). - -## Step 2: Create Fluent Bit Configuration Files - -#### Create `fluent-bit.conf` - -This is the main configuration file for Fluent Bit. It defines the input source, parser, and output destination. - -```ini -[SERVICE] - Flush 1 - Log_Level info - Parsers_File parsers.conf - -[INPUT] - Name tail - Path /path/to/your/csv/files/*.csv - Parser csv - Tag csv - Refresh_Interval 5 - Rotate_Wait 30 - -[OUTPUT] - Name opensearch - Match * - Host your-opensearch-host - Port 9200 - Index csv-index - HTTP_User your-username - HTTP_Passwd your-password - tls off - Suppress_Type_Name On - tls.verify off -``` - -### Create `parsers.conf` - -This file defines the CSV parser. - -```ini -[PARSER] - Name csv - Format regex - Regex ^(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+)$ - Time_Key timestamp - Time_Format %Y-%m-%d %H:%M:%S -``` - -### Direct the CSV folder location - -Ensure this file is in the directory you specified in the `Path` of the `fluent-bit.conf` file. - - -## Step 3: Run Fluent Bit - -Navigate to the directory containing the Fluent Bit executable and the configuration files. Then, start Fluent Bit with the configuration files. - -```bash -/path/to/fluent-bit/bin/fluent-bit -c /path/to/fluent-bit.conf -``` - -## Step 4: Verify Data in OpenSearch - -After starting Fluent Bit, you can verify the data ingestion by accessing OpenSearch and searching for the `csv-index` index. - -For example, you can use OpenSearch Dashboards or the OpenSearch API to query the index: - -### Using OpenSearch Dashboards: - -1. Open OpenSearch Dashboards in your browser. -2. Navigate to the "Discover" tab. -3. Select the `csv-index` index pattern. -4. Verify that the log data from your CSV files is being ingested and displayed. - -### Using the OpenSearch API: - -```bash -curl -X GET "http://your-opensearch-host:9200/csv-index/_search?pretty" -``` - ---- -## Live Testing with Docker Compose -If you prefer to test this setup using Docker Compose, you can use the following docker-compose.yml file to quickly set up an OpenSearch instance along with Fluent Bit: - -Under the `getting-started` section you can examine a live docker-compose sample: -```yaml -/csv_file/getting-started/fluent-bit -|-- docker-complete.yml -|-- data/ - |-- fluent-bit.conf - |-- parsers.conf - |-- logs.csv - -``` -Use the [docker-compose](../getting-started/docker-complete.yml) you can find a complete: - -`docker compose -f docker-complete.yml up -d` would instantiate the services and start sending the csv sample logs into an index. - ---- -# Data-Prepper CSV Processor Tutorial - -The `csv` processor parses comma-separated values (CSVs) from the event into columns. - -## Configuration Options - -- **source** (String): The field in the event to be parsed. Default is `message`. -- **quote_character** (String): The text qualifier for a single column. Default is `"`. -- **delimiter** (String): The character separating each column. Default is `,`. -- **delete_header** (Boolean): Deletes the event header after parsing. Default is true. -- **column_names_source_key** (String): Specifies the CSV column names. -- **column_names** (List): User-specified column names. - -## Usage Examples - -### User-specified Column Names - -```yaml -csv-pipeline: - source: - file: - path: "/full/path/to/ingest.csv" - record_type: "event" - processor: - - csv: - column_names: ["col1", "col2"] - sink: - - stdout: -``` - -### Automatically Detect Column Names - -```yaml -csv-s3-pipeline: - source: - s3: - notification_type: "sqs" - codec: - newline: - skip_lines: 1 - header_destination: "header" - compression: none - sqs: - queue_url: "https://sqs..amazonaws.com//" - aws: - region: "" - processor: - - csv: - column_names_source_key: "header" - sink: - - stdout: -``` - -## Metrics - -- **recordsIn**: Ingress records count. -- **recordsOut**: Egress records count. -- **timeElapsed**: Execution time. -- **csvInvalidEvents**: Count of invalid events. - -For more details, visit the [CSV Processor Documentation](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/processors/csv/). -``` \ No newline at end of file diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/schema/csv-logs-1.0.0.mapping.json b/public/components/getting_started/getting_started_artifacts/csv_file/schema/csv-logs-1.0.0.mapping.json deleted file mode 100644 index 72af9ec29..000000000 --- a/public/components/getting_started/getting_started_artifacts/csv_file/schema/csv-logs-1.0.0.mapping.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "index_patterns": ["logs-*"], - "template": { - "settings": { - "number_of_shards": 1, - "number_of_replicas": 1 - }, - "mappings": { - "properties": { - "timestamp": { - "type": "date", - "format": "yyyy-MM-dd HH:mm:ss" - }, - "log_level": { - "type": "keyword" - }, - "message": { - "type": "text" - }, - "application": { - "type": "keyword" - }, - "host": { - "type": "keyword" - } - } - } - } -} diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/static/data-pepper.png b/public/components/getting_started/getting_started_artifacts/csv_file/static/data-pepper.png deleted file mode 100644 index 9d6939709626717d40063f4d6923c41cd45ff3f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6990 zcmV-U8?oexP)xBy(Y061CzShfH)SO73p09v;IEK&egwE!wn05VnpJYU-2S4c zr`MUh;7ESN3TVAtkIc2q=Vg}Ad6A+fYrS@cmSBLCRd9t9L}M>eY~8+w|I@s-4r?UK29nTZTjqK8=>}v=SU-(M zGb341UN5!T*Us0kUuQM{4Q{rP|De=H=TB!7HCwm0Cbt*Y#7&sD$50cCK&ju={yY?X9!XhJ)WkW<^uN0OCNcPsSS#egp9jCL9B5 zAe=%t+ZYJHywoo1w9{2HTQ8Nelb%_^HUbt?9lv)YH?m&om?mYQzWda_n&FRkM#YOB zRS~LvS$p4BZe*=8>XDu{OJ@gsSNpT^q)rgAA2t~Lx-u%MbhJw+|Ir1RE=+ajXSZ!5 zKS{2(a35zUNee>1uVQsz?#_O0+cxr(q?uJ0Py3zQEXH6<4$AmYl!v7KTfIH}0B(ky?&`d_hGk7#d*%0T*$0x# zEM6KcTn7>i>V4Ul#jMoZWY&A<@2wDW+Zl;yn&I5F-??cYM#eVoFAf4PS1rs3m3EmM z$=9T)tXriN;ECqF-Hvh!LUA*LcWv2+5r2Z_gZer6tnz*6IF?~J-R=894wSt>U2R@U z?vqGCz(MKncf}x?f=tHQd(W1A7%8IhZ9YUF_|=BtYE*6J4gHjHKun1GmE=Cj6oiY9 z7yB8$VtI|9B8`HKHGjpOe-)V_RiI8HC11WbH2ygmQ>HdYb%B{kQYm=(0@E)c`7E_X zmXuTqGEU_cxBf+>k5oZ@ME|Y^bEPO+_s*l=Ux%HonsH^2PQjLGzYK#bgx!|?nh-`h z1==*X_!hso;B1mJ`e$XEC;}~5O&P9Eo|N071!~B*Ah8S;$!wrm+sEGrd*2?r#6qy{=oMHQ*s*yUQlJvyFtD#*&_4f6T{{Jt zBX99NerdThkt!g=wESltkB(u%Lmzp$(+tMIrAE|Oq&?yq8c?9_o&~ad+vD>U%#nD_ zVwp|0-j)K*vMgr&VljU6<>C&q`E6=?of_z=I5$9fw};qJ=#tsfe+t1dFT`5`3Q9QQ zRGS@~)d2_U3l<7jHc=!mASe<*fi|q{@9*6;934=g-@m_q^F0MWG)@63yah0@&y`i>I{UU1=%4UM?N7i6{@v|E)OFN0^l^8`7SLV; z%@bA?|2Zq6nZGH!Rg8jwGll_Jk1i_{bv+a){vE);slMXw|9yD~A99vV2vt47V$LDk zAbNl(A;mrr3MEjWj7)}sEnoHffymp3h+9ZO^7W+s5(*T5%8Uc|Iq}Z&kJD;Lk|S&bWX56v$C0ZR)3Y0w~`ZWJ2y{`KG`2NSY0jDVZ!u

;~(GVgC%B> z!aOK?Q&?Q?=Ew23d5ZUn)cXBqajm(%Z^vSz)5S;1z1PHlHPDE^la$M0%YZZ!b&Yu_ zlu4wZV@F>A?^GbQt4sTHsh%Za=z1wz6cU+c7g0j&-+e5=w3r<{gxRq+iDK73_xf@W z

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 a|d%;XHdrN^X%j?d$C@%!$_4{*XN;?u3%M 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 HTfY83m%{W+ diff --git a/public/components/getting_started/getting_started_artifacts/csv_file/static/fluentbit.png b/public/components/getting_started/getting_started_artifacts/csv_file/static/fluentbit.png deleted file mode 100644 index aae238e11d34893151336cc4b2dcbd98898e0b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6693 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 R`1g8N_r8%+BliLvNvb9b9|e;EkX`K zG?4s@=bG**TeEJ?kCvNIdjs!YCa@XkyBIjeEQjCZW56X-xa&xwK(oBEay=~Ns9}q_ z9!7^CzB??{qs;g|Qs%C@TpKRtgBi~4CIxK{?Fnl)U%v-;@C@ntDujiFcP0b{8CT)W z2UTx)(tTDEcg$`yYpJV8vsf96P?Zv5WAawR1}a%?%3;$>bj$KRaXfRg>=-H135cwC z^DEl>Ay>88+2$3~glz__H53y2zY@6_v#P3&7Traf^@qvjd+9zH+1`XZRU^{7mi8zN z^!4j!Y;or#pk4py=;)Al)4s(B9r>g+S8?dBg)HlRuU9rUHmTELG)H%!VNDMY4;3(0 z0h_i<&|CsA(H4HJ_YI`+ThEB0VWpQZU;1)B@D7AcQ%7p9fX9Xo0>t=5ww9Ixo36BS zM%eJfJE1S0*xkg&OfQFd1x)ur_LM9b0*sgv5uz2$(4fWP7UkE`59?4)s5zH(sg~1)KPvq)__ejp6(EdYH&eMV6;bH3h+-7~nko(Y*aKV+ss8PPRy7n7z8ua%_;tZ64-KeQzSA#nI`15~4p)zsDZ1;Hy! zZ%1IY5=az;ym+$XZZSy>DJ^Y5)U*)d8#qs$$!edPQ$Y;5M^t#H_xR)Qkp{i6(2cK> zS8twfg5xUSC@Jj``cS zEd2cZ57{7rJ~G>j6kor2yBHrmZA@>5zphyB&24RMrBB=VQ4%y6Hxt-L6ib_BSaeE; zPXhv87~gJv`sO|NOzkGvZf(i8Z;`|cB-rqK8tUrhoz+`4bOpWwDPL_$8&pcYmXbB~ z1esnYU@R!Vho~Pzh)6-Fl{b}@mEPPhk4#P%3!M)x#4@6XhhG?B!cXpCdIvy}l1WKP zw&kpap-iXmwg3`IU+?X8zr5AROWG4V=mKJK%#`TjnLp%-(Phygd}8Kwk5UQtoX)AlUi z`O}q}wUP9*6v@YF`;h(ntoI}L!13L>eY@E}JuTm})P1?|aQkHDO~E7R+ug{I_|W#v z-i2J0R^h~2JN3o;d`E~gG!D)q1=;J#%Xf#+lTzes=@+Q_tvC^2pO#_D;cH_Kl&aRPps~o;#RJCUnN8F&h1qQfwf0LMjRM2SW>)fFV0y zr0O)Ei|d`^?TS=YtRly!TfR14It0~Ydtr)%LJLoN%OByvfBjNwIz~11OYlR(Lx)NF zK9}Ph^p5m!Q4A_+$X?#V?EJ1#>P_1cyir~X&u9R^mcJ^n3gpl}>1KjTpWH>l96tz<+!}&ndB4>%|JJhNG zR|Uhw5nTr<<3IcR?nB);6gRr2m&Hb#Jf2PBg48uVl{8T?&#pio-xNW%Hi z1K|MT6Zp*;K)k>PR)s%%5AD!^fzT(|?pR=T(?^fd;u9#H=lF6k03q?67*m}LJc(3$ z4A45jex(a0|_OTvZm z!N9~F%xE;KayQ$1Cwc64+kaS1}Y zi(J=y|NcGrg%J%YF}U6F@$sij+Xxv4hqAA>P^*{q+kvs-8b8`77L1X=wgvGK4|+f^ z;duy36@t*|-COyu9-f1$dCJCSXM zPXpDyF*RMViJt1*uX0-H9|=}u=bgC&xsya-b$)~vqWk;%U3<&tn7XO@CV<@Bh*zCu z?k&GN`Vev_iolYI0KC`P+1WtfWI{Vb{3RwPi^KPM-PUL%URxtv^4^*h1<~P6z39SH-opr{>YuQtHYM z4ttyOF@*%yZ~KPL6HLC+ld-$hDMH4>vp(vCjL2Erc2XP?1|)39Grjq|!+@8EC-$@A ztxs^R;^JbLpjrv8T^d1Y-pXnp+3KVFH5X8%cRFgbxc;Ify?z$Af5)DNSa)`C(Ej(9 zOlN>BAdc7j`};Gt7_>|4Vg7(NarjTWi!4+JE{ zgq+=JN^}wz=`1h$JS`e}5B<*3#STU1E5fuXofWTYnAb`(GEoMjHDV6+mB?mA={6MT zf!@fg#Kgq&&YG6O@_ok|gXc+)(R*NFVj7C@-RIU)O+>n~$k778T{r-^+D!9uSq?GY z1cM~#!OxeM-m}-)92*rivn6srxRd*$G69h_$q4dRJkzEn=->)VQ7 zc-d&0lzB`gba~})wlu%sN)4&c&xv|fUhj2P`b>`qIsW}DBs4WPGP2}qkTxa7WYoWs$nfk!#whdKnWD2@+#V}w@6OR?<(};f0HM@ZI&3x4H#I&H*+Je(@x|l66Ci z_UZ&SJ)Y2VC|zuDVfthm6FP-3TIs=;23xNu%Ce=u8s@X2QDbRpN^=K>0RdIMkai;1 z^PrcEkB<-O-*P!=FAPEAfFpkZJ`g%P|KxrP2vfke0f6Wp$!n=tKN9#huf`96o zy^f=XCU)s!M?n$71sJXKl7AwB_KHhSFP)h&)Y8%^toIC7=R!|{sU~9&zFq^^-4M`@O+HJ?^Ol`bm|7!JW1HDIo_z!P%*&>;c>9a za&OT!%J%Y_gz&|as1U$y#RybvETeo-?K&1*=kVmjX6Ykil|y^X`N~8~fx}YQMh}Y# z0_8qAreEn^HoetGY=R31JeFd~bIu^oZxGMh4g4OOxYW(f(Nf>Dn^(w$mcb&uildyG zMy&)RhipuY>L`!Id0)>zz)wm3^zq|uz4#+7+iQqZsKIq>RC&jvro?Ab@vsK(deK$b zzLg(?=5COozM)~G^zc@6@a#4o)VMj=7FfS7x-(8;axyREyqht-WqNB^4AKO?2^o-4 z6XiuN(JQsHL=Yl|P*v>fMro72_}LKAr1F*m4?}y&}p00#yFC6!lbbMlRMo4j@3gb zI3&cxOmEyrh_?|BiljSoaXBwVdB;_Y9mP%;FNh4YL-)wY=AW+TMt`?G!GwIB%PTbO zd`32^tVU#N4B7+{TF_H=_Gay2{vQXvkiC|jUFqCeb&d5zNvds4K!sc~1Uxs#I)oP; z&g?c0MC0P-wn53?EDc@+o^#8EK%5SXKjf=n^R!Iuz^{Z*!!t8QZcR%t@<)&C8%RZD zg|OjjPw$=AAtY-kFdz}MqHyjavvX@86#2A@g%;4#!#8KPu^@X_xA`LtAbvBZVGBHI zw;^e1X<#SI87hA$dEjvw24rFbgJ^0XvW5Q^q z^~4%403(i_X$%n;b1#wX<p*^@aFhWAl z{h%Wm>sRkY+*T`CH^vx{Z^8#gKkPKAwcQH84Z)*+GW85aql_{o27eVV4fvgBMF~Bi zP{n}*U;nkdlk#X1s`IQTDbhUi9&{@6r$|z{$+{p)KSKOC?>~T$yv-ZaTdG5wPqbJ| zIR|e;r>a{l)^UP!XSb?9k}x`7o<75(e8nn43cZ^)HqY$;wedFTDHhaxuZO^DN-^hQ ze$}5K#?aBWH4kP;E@`z=!q_A2i4!e@Ck8ZM(448S{qxN5(C6Zqd=1y^PZgxLR4K6> ztYC451($m0@sL?hZLzlhj}#uEb70x767-aVgCkn=Z>7rK(Ha{%b4w3nHMzjk%M-kNXkQ8X#@f3lf3Hm` z=Nbe4EIu^l-tUnSvy6wK@nB`xbhuX)Yc&cBF3+G1E%JTBtZU;&n+ac}z>ojC-5{90 z0I%f#Et+@ivxO|!P&Et*7Fl3+a$9{7*b2sECROyk8~@DnJSEhk67cWFv3(@tt~WztIM3Z zhVEo?XQQ@zN#x3B%VuL_2rr_*{B20Rsxu4mt*0qu+JAmYD(ef%<7hNFS;$uM7nl)I zYK)9CxJ*)>-YC)LefLhSH~hW})p{&t z&A=INAR~&mx4}hcqvfiiF<69jfJJ-n`)g8;r`j}YEgy0%?KH!ZDaO9#KZkiujZS-C z59J2VuBJt#=|tuJO!*wVazEesWj-T=QRk<{DW4tNE!357huOfx>*1#^kJbkL#VOU+ zqt%Ue<8P`9|NT82g%@FYp<2x{Md33iF6QwU5ndu%us60;wdQx<%KONjED5_m9D=_+ z;yXhA43u>~{0bz~I=6OBLy5tx%dF68LSPRN7(JwM1@%P=OAKM$u3?(@B09#teSI!F zL8Ub^q8v<=nCi-R=_7hLAw^(;tJPd&7?+?~;O^_7;JX+~_~Y<&m0G9wIR4;9nt@$Axbx1l4)sUU+4qaTU6pXh+&`lOg))`G`l# zK1HnmZtsc(w6V^STGCy}z(TB&Iu@^NGS8EljQR#dsOWKGSLKSL&At8`jNdATroHCp z?#y0(nv|;Mn<;xu7nbq!fQt{AKAm zBU1Lt#fQyj%Hu?Z&3z;Q+nJZo$i-;NWvAq&pV2$coWA*~qPTRUM0g2&h!#4Hq^xmS zEB#ctk!BQpTq>YM;AF0Bw=Clcqi0H4*eTsdo=jX*%N+Sq6HBWR?+rm59sX{h> z({?=?%QHwP_qz}L5n483{lf)iqJs5&h8hFG!f+`{{S$we0xyvxKY7!4=9<2SSs}_ZYQ|~xaZSsr~F5JRsWegX0 zG>n)%|8g#TK5M(&nA!9acDj$d)$CR?U7Rw8rjw`$(btEtpf_t)n?vo?Ub?bWBGHvL zw~qu(TrB6t-yy;^7y{%fIb5{o7VNMgYJuHctf|8=)cFxFlZ-W55@bT_5Sc^@=G)%yCcL1+yb;4`LR!a8T;YGvt z!>bLG{LRy>uA{#R=}K!zHDkTBs32b;bBqYf2`PSIM}F6zgCsx<9g&}tn^d`MU@*KG zQ$V*>|26^04&>Ak1t0%f{*Ku4)Dg-0j~K?v^^N4aZcbH*XleTJ-b1%Tib*vAZAQKn zd&71DU1q(tOD~KsV24tG0MI0IBORIWPSt0J$%RVg`ZhAHlL~g(BQqc-^DwBs3t73b z8e}m0)Ii+=5pH0I^};L5dU|@LwjWp=Kn_`D(6$O0`_Gp(_jiMl%%kvkX8am=X%p~d{sL(s_v@j zdjYhof7#z5vk}k6G%}8wM!K6>w|C+y*Et3!=E!8Y=oCgtXf{{QNbti2vEe*J)wz8? z*_XMy*?)~!7UozD_sFl#v}$q|OGNW%a04A%uw5oZdAfu_yQ3nmbK&ngR$8jl(Lvg2 zqnOKgO^+ zXEs)QS7b5%gOya1EN>~YBK5Le14C-E`|QZvdfq>ul(_XCpo-rY(@mW=AIl{Re58wW zn%t9$2G_)_J~_3c%_*$}t@Sl2*{Y=yN^%h^S3QpbyW_mq9v@=i(r_t1!8g|{*7905 z1)5$y#pNO8U7An6+|lgVCjhpcnvPL|>wLq-Xx)t)KQRDLc3DD^Dzn(BxbQ#uaC60& z1CiMuhb?N_a?%yE!eMs=NRAV?j^d%i1QqHdAQrV-)yI&`M%T-| zT8{pcsuGM5DWgGQD>|aDv7S*Hy*(cB^EGe&XKK4IeSbE8nXXgu#DuJQRT8Z-frTbx zomK)a1CT34vDKzaD_s+zsr9)@_xHQ1R8C=so%26=?AQFIWW+JzjdXJq#eMP}gZpMR zxjM})&psvCocHEX6f&g>{pqj#*heVC-xkNtJXSDJs_+}THgi&1|Egmw$$6b_scQOI z!0+VB8As!0tmu#jWc_XICeZkf?1r`u}#B~OyvR%SiBo!sbH9^Y)2ALX_%K%YV~zUan2zKKeK9Y%d#-zjFz zcmI0OMF6zAd?JD6>&sHoZ=t2W7!1Ua$o7v;lHlVn4?{I{4f5!B45J5AkD_^2d7VOG za}`U~;i!Y!DE)R2*!*$>BC%mW2Gkfuj%Lp%+1OO>c79m#{dnWFa3L-qu7r}Rr-j^S zf*60XzWjLbU4Oqt@sa2b^)p3%_a({Y_`l>#I;b~IQ9{G{Z<_%k;T!LrRDHy;+Ww*# zwX1Rz4(2)M<%(z2xy7?aJj|JCMo^L4_>i%MBAf6prTpXz6Q?*MOADtdx%cH#`n&Ns zGS)7eJDhw4Cx3@xWRRoACdrXu9<;p6A2c+5JgTzDwOh|?bcmJrdNd_+P>*NtKq5tj zC5l&+{pmw1T7S`w60Q(=>f%|4j4^je*P`{LIRm~6rBm~ga4f0%5$RZevV-N^#tKu* z>&=)|h5PYztoL%x(QCC4;X_mw)}LJa#&~b|ZTpSem>8HLRHkjY=R=zLR@0v<0$}fv zc{yzEK>f>-4l~apvk$C&9(^g;&Mpd*(Ok3_H}6&v!PotEu`uDEQbo4C>x95N&m2#D zgoAQ@E1Q-GcAuk!2Z7yXR7(p2Gkj&ihhkv^ze0ys03JdMDTd<3QP6Yi5F&$%0 zqkZuBOtXx+VsHPc{%e{CYJhu-n_(`)#~cXczvJN$xY^o{+mIrj^~i*GPJ;2aSDx#f zRHKrN(*Ldn@P1nI_4+aJD8iBND^h)$=x9stFh~NHjBm0_#8tgr0P~x!kn#l%hSlP) zpq`(-a@OML{cblr06Vs(z6thB2KLPD!1_)l$g8w~us1ET*i=TX?D<>2w69`V7_EOM z6xHp_N|(rkVxO@~Wrrxt+AdAz!+~=C@iGy}lbmB?&MP9{w)0rojw}aSDFrUan2Y?K zP*!gKIo*~6i8q-MZ~F38@$&gdBf&+HV8Uey3BOF9r9>v8%!vD)e3zsG5fkr&SklyTmiQ(w~Y`d+l30Q?0@UcEkP$``#e?N=%KxHLCASu>g7=b`xN z4Gf5>ZT;sYa7}2FfA2FcQ%ow2YfWSy)fDSgPXBtYyw0kXgUJO@l!7D_@^p>=SaKP5 zICAIS#N`f_Z-2{b)n;)2!Q=~p zBJadWReRuD%`Ul|ccHGOD4H9eD;p%cD=rACze2O;f9Cz#ORPW5B4f#Qe^YUzC^Gv4 zKRZwLr8sK~*ZglY_(;d6#R9J)6|_-!eSX|x4YYp&OqJr5#J1|clllxaGt*hznf}q4 z*3@1FrBLO5-M`?2I4eq;6yZxay7M4pod<=+cx}&OND`0R`oisP~JV^Lj z-eJzHr< zuuB0~KGI&6%8R+#PL+ou3BdXmDnI@lUL^X2#gwU3MD;_}hu~ikdG624qW-*K8dydP zxj^bWP-J=e%?coCg2dytm4LIaSDKVf==M$y>9SQ@T(V?@6q?I!_Y*IYc$yK!%~$|z z3=nZh5-?l*ta5aaSx#>rjs91P__S#<+$P&<)mxsvIS#f`*hVu^da;AbpBT_ySc%EzunB6lRNrs zG4FvaDrLwa5VkFRWflk=iadawwTWKguyi&PwJE|+8D~>q^iN(tKu_(s&adMc;Dt^C zh*L5~M|FHSIf41hpUcy!H|qe&qjZzfPhyvmQzumov;Cjxoc@u)TWrYmo-WY9g%6Wlm?Q7j|kplCOIzOGujJdsa#OL8LN}F>Z(ZVy32uA1>6C3cI;b#3XtzE zASGoKi;*F+7I)!3CS)o{b8j$~Ol8R2q*ip zCv6^Jn^!zum#)*`7&H7>4?V=oY*?@(74aR%{) zOgi;Wr^AV{tjy2$(|p@kKKflafx8i)KN3%asNx01G)At?lGv|)WqaETpDjRjBwA_EIkoixzfl0nMF|3$r#ie3&RL1|t#Q@Jf-@~gyzq%&R+$%&V z!nwX#h?qLq<{&lMWxY6|hoBbaYxdvCA3&O(e^4+3;QGO-y@x!Vp5^a#Uw1xG1VG@c zhONc%fT&jd7Tdr_OcE^X&P*SZ2H-&0_lOWY)iYcafWYao8h9c-L`P6?4SYyWzKN|# zX!jFVfnTPvPcdrh2b%K$_vaY#DoZ;Juaeoz7=P^HVAeU4&W(?|(7#am;16T7o*GA7 zS6?Ikx%(jA8+UhPt0z9zYM}I3pkxHt*+5r*xyDQR2+(yxyPd!`4wg+vC27B-$stiq z8w_GpMVrX?n|;1Y>aCwl2sChBOm^W!kGd2oGV-OWE#=5mZCfd?G5Iz1H3?l0EG0Es zJ1(+wNrJ1pm`b5^5D`Husn!<6yq${sRDb%;=-hnhJ4quTx{<)o4puFZ>m|0Yzmz}g zNslc}vaueW7|zYw2uH5fX8{2DpGUW^mrWJ0(T4W_(U3|gtm_ZFtccKh*$o-*1L|>y zZ&C)$RrJp(vvW2x-}N>6=9HYClcEFEq#X8Qd?$56w_Q{At~~g^curiOws!%2^l#6^ zz;C?Do$flUa*3D-TU(o`G)pCy_TH1_7!Ou0QfnKSh~O3u&j)4flHdW>dkB_ zvU0h?A#Y9wROh-sIPt-6lam#bImOB{VzVB4fHA(;aA@|q@X8=vsJ403yWU4j=kNVW z1#e(n;n=dZqqh?2b%B=o8j zc(LIn!Ue}yTS&XD1ky?#+kFA)6=@!i|VUs1`1fCoXY^6@5-Asj1URZmH7)k)*Vf0T68|^f0IZ z{+j`}iI@g=N$OV#&MGm=j|c7HHi#bDC-R*+nBnWgz)2uiD4y4SKuVH6lbmMFH5k-R zRV}phxKw07f)O5Weg-@YUtr4fl~|`l3E^FPx5}lKaq_0Qcvl?|+O=0-StjE);DXrUCzP*l zShBjAr!j~~gHsIOc=Ol%!CGeu5HwMB{kfRo@zWH<{x3j1q%O!{&<>t zmg}|(UJkxmX-oNKZ1?szcvf>QVY%(Y+qD9e+ET;o( z+ncNJd3_5GRGUF8i=}s>VP~?qEhY~eo3`q8;IrZuSkn}dz`TenAFxh6H@PFitYT&p-zfi7f74v2{E9(*Z(P(kw@b`s zd%#l+eGeea_qxcqAf?rfp*zW_?NA)SeQlBJ4`R*~g``{I$RPtN<)604AeG_yH!C8q zrhDdNyL^HQmn&y9U05mC37@~Swdr6Wzo_M#@wUkyfW}+~*hP<0b3=;@z^#IK5Yl%) zmD44loY8{uQYimX0F;XlS($?5p3JA%TSr9ed(%`C)zo%QBG$S>E`d`Q$xWVrmm(gB zmh%%6SR%DF!p36m9^7ncX)=lMS$T#I%+e-PsZLbqDsPB=Q~4Lyn3XSN$UbJAf188J zaCjF(k^bflNX{gmcNxp&pt&J`n++D$p?*4Pzc@L1{s= zlCj1nJ#>JYghJ)Z{5wl|jgpkt)fSksY)p!4om&6#l81kwEr;v*oe9&LN!2gtsMY=! z8~T*Ait^MZKbSKYF^Skb01+`D?(<%01cr+`v%WgO0Uo7wNwK`#Rvk)Ihsf{ms}8dj zljV?OnW`PPi%JyHg_b~}8qkCww<>s4KP$LDrZyj`e^OZh;w&m64w6PLLCJHv&6S28 z<`%LnjNf-PB}fW2-+l)-EDVB9_<$W&TUIQ4Yx-cA!bU(E-=6W4z}ptjkPygd+!q06 zJ#z|WJm#?4PNb)S=a|t%YAn_p3qw(G5OwE%gOot z_n?0M9gA`K+eQl_r}2XuKe8NBMI6;Zq)BPbrJteUsR8c<-O32+TjIokCP-mb?I_Mr z+{q0g`~h4xjnq%61CQ-r_rz(4?5+Fhc4tPv|K|%3skq+ics8^uW^Bzg@A8sfC<&NgdU;wFFv_-F=($3vSpo`8fGr675pV3(}n|9xIMbTb?LUpvg_)LhBLrdw) zv*%U(qYOt$I3om=Yg-}FLSA!(U?k_z3$^;%^PkB~27;4S0IMWj?x8Kd&~CQwvGNlR zr{&p0bf{{#_~r;7wx*%s*F=u=byo^Ai~r8LWK-2>`<20dz98MH((R1ih+M_dMjQzLHS{TfpNx95vSZ0 zdi}Oo%;L*mJ+a>JUwS_;)1GhEC&@_^{O~NFHGd_EoUO?!|3v&O-NKzYLj#!p>4*V4 zC`AJVh0(|ZZ5)A)%}y>m4C*&%&T(%Kw1>K}%{NE@sqQ$6@~Z~$Caqr>YEG~H=j z@3dN?UAdIe3nyroHBEXZ;(Z$&P`m^yfI|{j+tBob& z@!dpHH&^V)b4hxCy4 z--tNdC}c0>`b`*luD(%28qM(Kp(e=EYn3%hHf+yklc+K*=uX~wYOGeISDKQ2gInZO zbyPN^BjVn&Vwa=vqa)#C=`7bxpw9)RA$~%Ft*T=pUWaTP^--%6icEGrp^o-F28Ub-qzwK0cHR?X~LwV5=A%ZU;q+4NZ7VkC1U}I40hnY1_m!_ zKOsx(Lv6u#=66AiOf^G1axICx?&K7ivF+llkjID z(z1M%hlbx@;TqQY1KJGR44J z_aygvG?AaiH3kYpZi4Dh)6wH=+tMhZ12R@lb-XN4#teljY;0@u+S)oBGCt}b{4O0r z=={D6jf@Pd*u9DI9a!AE)vEi3_WtGNAb%tPg})qRMjI#8A=FB zL^z+IO#&&RM_lSG#Q19+I#-{f^dBTgP7{LC<9Sf%FnCOD$FIGUxlC4wK>W}Z4W$CJ z?6rYiiZ+qURIl5OeXj^*HeMZq3Pd=!_3Ugx@%*&)W+LhvlSVGG92BO5k|i|KmmxmL z&XyB5FV!aGThkhpQ`1?oo!PY?0YDrc0RkdNyeI2_%VN+Z`Z0`9hT$@`@9-h_VJ4YL z+_&=wf|#ujZ>2rb1c@$mJg+;8acq9P)ISC*n6UHShMVs(FN6rt<;nRivG1D;a(NNn znAw`<%G-5Ja5cyu0P?M({RBkM=CCYD_(paly4#zig9 z*^T)%R|)|v;~&@%-47&h!aC@?sRj73qU$-AN^18%oG&J{WSVlWxv~hLsi8H`#>BVD z_F|Ee;1lX_~fb)bNu`scX!D{B)Z2gG-fB=-~FV^1S z-jZgSmh--y+B2_PEMU^J{F1axBEQY0ddss8P|f!YJyXVf7}4!{l{|;ADe)1+yKsLX zE(kh5Z~~vRHCWc6FS~v-n1vL77khH!-<1PADi;E7IhEk-SvJ~CWAmDYdj@l1Ch>J?kx7XGs z&<#f(*PN_(?}#ks$$*X^-@T1_A#?@m_pjf|og8^=X9Q{t{BPnzZ#jMUv9(ISltc@f z6TH`O3e6_P&ntI~o`!*Tj9|zh9J>G+_Pb{+|^h(6uv<3lGu= z;aTdLw5`Daoh9B6p`wgz!3iUp-ai+Y5ab@mfz^sI*N8Pp*#Vaf)pojJv=Znh)dy3e zAjt2)2zr`A^-}wJI2ywR=6O&E=Rs;)1FmAjn+#%5VR3B00gWoFg%I&Ayf}?78~+yR z*TJA^;M9rlDD(sM-^|eaitp$-5(=Os?HjAjPX|I=usTh*0Y*lzRoHLSUoXJrx~HK_ z&TMmW&V?_O4gs>O9t@Cfyvwjvn16|{v=^RoB^CtF1%ud_{_W9=DjUv^teoaR$vV|) zBBW+wGS9MJJ0jHAKyk|%0M-CN5wnO9OvdVQCMu`KNPu%LD5?X^dEHiFmOB|peoEe< z+YpqtoDZ2!9|tlZAGzB{EWR|pfeoD|-+An%-8;)>l|YSDyO~ z5!Ulq!XBVhf8l1@Er^hiP?-K|{Ef2k{Rw}+%^_No%Z6}KhcB<5L-5M`jtv-iVr=W= z^3P+WFQ&YzmL?1;PgJM1>NC`%rtT_#QAgOj{{CwY1Y+D}f#caNaSP+c#xl=ru2 zM%%Xk3lm%jj@bQ61%CyD!5HbAMz+MjX2@0XAbD$R>+>pvUHvQ`1Q{=$fpY>p)*wG@ z0h(W+R+ix>(B^!L9}QJRi{|jF8ZQi}^(GjTQ&&_}Y=TYe$XPo#kO9eVG=&Y;vbCL~ zj_5LZ5>(d=y1k_I!C_fjSxwTdKat0q0mZ&>%{W&KiD=NUc>BlevbcD2nB%|MFZFQ& zBn(#EJ22qq4;nyY-ZX$hXDFWzhE8p4!9l-}n_|7Odf@aGXu4q@7J_cs0K}Df$cud} zc;N@W7*O+S2ta;oYb$l22$!{-bt55KAPNs!FlfF3wSzaN*}i+{EzS8L#YS(Oi2kT{ zmIQ*jR~jJB%^yJ|4dfIQ^QP0T`3Mx_dTF%4HWB(Z#cuz8zp}DoD=!{(7z4UXHbD(5 zro0WP45hQmL3Hmss9{0~M!?`Bl;XaPs>Ac?XX$kL<>g$$_d~R%t5e@jAG?G4_sMEX zXGhB3@?bijUimQh(56txRQ*@$j#h8E$U$!+WKT8lKEQ~efq~di zO2SgZiT~9@k8&LL=iy7rGeiTQD_)Y8fg z(3i++6EQ-b%x9~{Lyl(F(DDWdVOna?7WMb8~t1xR7|_R zn_sC7H`fc-ag7NA?PB%}XSqWHr1 zzy>z;!w{HsL7km4J{uG!+*-DFX5f^=X1iZN_VcRB_sU=f)ZX*T$is2kr;uE|yGTid z?-~{o$>n4lVXi0R8^K6{(P|zR7UmZ<`Uasb6)3jE>r^<+*DVEbWHRtB8e(BBx$0m126nxdy)k#H{aO$0$mYJO|QTvu!jpW!kYQ=RA zLy^PB{kM96mcgnDB-pch! zu!+O+&7)=_Z@Fx9^Ps0h5YyMfLPa;6ol848~)>lgr z>(}!r6{2E;TuW!pp@hq~KnqyQ-_X;SV*qzhP*T#5+}bkYuzJo_@>Vb2+SYETfxSjDZAy)?02oJ34xpH{C>c(+LtO0OH7!?yesF`fd4V3DX!5#|6y7 zVg<*y{!Fn5LVS>;D<3Q`0v}d@{!oNgsc^+}IdFrjGqyhn(I3A6dSiS;5C-(5^|QCY zXB7BOSGU}|{Yl&a*hd?#+_s?QKT(b@8hi%9oaOZK1$`V^4xKsA6jthRwENJe&cNQmVV6z21J(n4R&$y$NseN=;(;emOq9WA2gWj>kD;N zZ%s^9UwO)R*q&fP@`HAI5F6kcyy@=O~cS%I>3RPKgwlAka zt?z3Qxpblcl|X-qg+G9tscMoH%t0wF3kSzQP}hALz7r-KzZAVqG7IITXOc=yhb(I%2mFd2-<01E{uc)Y)-C}6^i^B54jETY+Qx5~4 P0wgc3@}fl2G~j;$+{4 \ No newline at end of file diff --git a/public/components/getting_started/getting_started_artifacts/java_client/java_client-1.0.0.json b/public/components/getting_started/getting_started_artifacts/java_client/java_client-1.0.0.json index 9097b6e85..7eddabfbb 100644 --- a/public/components/getting_started/getting_started_artifacts/java_client/java_client-1.0.0.json +++ b/public/components/getting_started/getting_started_artifacts/java_client/java_client-1.0.0.json @@ -42,74 +42,7 @@ "live-sample": "true", "workflows": [ { - "name": "Quick Start", - "description": "This is a java-client fluent-bit based docker quick starting instructions tutorial with a live example", - "steps": [ - { - "name": "Create docker-network", - "label": "Environment setting", - "phase": "docker", - "type": "console-cmd", - "content": "docker network create opensearch-net", - "description": "Before running any docker-compose files, create the opensearch-net network" - }, - { - "name": "Setup docker .env file", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "input-params": [ - { - "name": "OPENSEARCH_HOST", - "description": "Opensearch host", - "type": "host-name" - }, - { - "name": "OPENSEARCH_DASHBOARD_HOST", - "description": "Opensearch Dashboard host", - "type": "host-name" - } - ], - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/.env"], - "content": "wget https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/.env", - "description": "Setup docker-compose env variables " - }, - { - "name": "Setup fluent-bit folder", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/fluent-bit/fluent-bit.conf", - "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/fluent-bit/parsers.conf" - ], - "content": "mkdir -p fluent-bit\nwget -P fluent-bit https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/fluent-bit/fluent-bit.conf \\\n https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/fluent-bit/parsers.conf \n", - "description": "Setup docker-compose fluent-bit's service configuration " - }, - { - "name": "Setup java app folder", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/java-app/Dockerfile", - "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/java-app/src/main/java/App.java", - "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/java-app/pom.xml" - ], - "content": "mkdir -p java-app/src/main/java\n\nwget -P java-app \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/java-app/Dockerfile\n\nwget -P java-app \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/java-app/pom.xml\n\nwget -P java-app/src/main/java \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/java-app/src/main/java/App.java\n", - "description": "Setup docker-compose java-app service configuration " - }, - { - "name": "Run docker-compose", - "label": "live container", - "type": "file-url", - "phase": "docker", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/getting-started/docker-compose.yml"], - "description": "Run docker-compose for the java-client live example and see the generated index", - "content": "wget -O docker-compose.yml https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/java_client/getting-started/docker-compose.yml && docker-compose up --build -d java-app fluent-bit \n" - } - ] - }, - { - "name": "java-client", + "name": "Self managed", "description": "This is a fluent-bit based getting started instructions tutorial", "steps": [ { @@ -175,7 +108,10 @@ "type": "source" } ], - "content": "String index = \"sample-index\";\nCreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index).build();\nclient.indices().create(createIndexRequest);\n\nIndexSettings indexSettings = new IndexSettings.Builder().autoExpandReplicas(\"0-all\").build();\nPutIndicesSettingsRequest putIndicesSettingsRequest = new PutIndicesSettingsRequest.Builder().index(index).value(indexSettings).build();\nclient.indices().putSettings(putIndicesSettingsRequest);" + "content": "String index = \"sample-index\";\nCreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index).build();\nclient.indices().create(createIndexRequest);\n\nIndexSettings indexSettings = new IndexSettings.Builder().autoExpandReplicas(\"0-all\").build();\nPutIndicesSettingsRequest putIndicesSettingsRequest = new PutIndicesSettingsRequest.Builder().index(index).value(indexSettings).build();\nclient.indices().putSettings(putIndicesSettingsRequest);", + "info": [ + { "url": "https://opensearch.org/docs/latest/logging/indexing", "title": "Log Indexing Documentation" } + ] } ] } @@ -183,9 +119,6 @@ "schema": [ { "type": "logs", - "info": [ - "https://opensearch.org/docs/latest/im-plugin/index-templates" - ], "content": "PUT _index_template/application_logs_template", "description": "Setup applicative logs index template in the dev console", "index-template": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/schemas/applicative-logs-1.0.0.mapping.json", @@ -197,7 +130,7 @@ "logs" ], "info": [ - "https://opensearch.org/docs/latest/dashboards/management/index-patterns/" + { "url": "https://opensearch.org/docs/latest/dashboards/management/index-patterns/", "title": "Index Pattern Management Guide" } ], "description": "Import index patterns `.ndjson` file to the saved objects", "index-pattern": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/java_client/assets/tutorial-1.0.0.ndjson", diff --git a/public/components/getting_started/getting_started_artifacts/java_client/static/logo.svg b/public/components/getting_started/getting_started_artifacts/java_client/static/logo.svg new file mode 100644 index 000000000..a6410a04a --- /dev/null +++ b/public/components/getting_started/getting_started_artifacts/java_client/static/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/components/getting_started/getting_started_artifacts/nginx/nginx-1.0.0.json b/public/components/getting_started/getting_started_artifacts/nginx/nginx-1.0.0.json index d70847ff0..ed7dbfa40 100644 --- a/public/components/getting_started/getting_started_artifacts/nginx/nginx-1.0.0.json +++ b/public/components/getting_started/getting_started_artifacts/nginx/nginx-1.0.0.json @@ -108,7 +108,10 @@ } ], "getting-started": { - "info": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/Getting-Started.md", + "info": { + "url": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/Getting-Started.md", + "title": "Getting Started Guide" + }, "ingestion": ["fluent-bit"], "structured": "true", "technology": "nginx", @@ -116,63 +119,7 @@ "live-sample": "true", "workflows": [ { - "name": "Quick Start", - "description": "This is a fluent-bit based docker quick starting instructions tutorial with a live example", - "steps": [ - { - "name": "Create docker-network", - "label": "Environment setting", - "phase": "docker", - "type": "console-cmd", - "content": "docker network create opensearch-net", - "description": "Before running any docker-compose files, create the opensearch-net network" - }, - { - "name": "Setup docker .env file", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "input-params": [ - { - "name": "OPENSEARCH_HOST", - "description": "Opensearch host", - "type": "host-name" - }, - { - "name": "OPENSEARCH_DASHBOARD_HOST", - "description": "Opensearch Dashboard host", - "type": "host-name" - } - ], - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/.env"], - "content": "wget https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/.env", - "description": "Setup docker-compose env variables " - }, - { - "name": "Setup fluent-bit folder", - "label": "Environment Parameters", - "phase": "docker", - "type": "file-url", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/fluent-bit/fluent-bit.conf", - "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/fluent-bit/otel-converter.lua", - "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/fluent-bit/parsers.conf" - ], - "content": "mkdir -p fluent-bit\nwget -P fluent-bit https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/fluent-bit.conf \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/otel-converter.lua \\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/parsers.conf\n", - "description": "Setup docker-compose fluent-bit's service configuration " - }, - { - "name": "Run docker-compose", - "label": "live container", - "type": "file-url", - "phase": "docker", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/nginx-node.yml"], - "description": "Run docker-compose for the nginx live example and see the generated index", - "content": "wget -O nginx-node.yml https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/nginx-node.yml && docker-compose -f nginx-node.yml up -d\n" - } - ] - }, - { - "name": "Connect to Nginx", + "name": "Self managed", "description": "This is a fluent-bit based getting started instructions tutorial", "steps": [ { @@ -180,16 +127,26 @@ "type": "console-cmd", "phase": "ingestion", "label": "Log Parsing", - "info": ["https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/fluent-bit/parsers.conf"], + "info": [ + { + "url": "https://github.com/opensearch-project/opensearch-catalog/blob/main/integrations/observability/nginx/getting-started/fluent-bit/parsers.conf", + "title": "Fluent-Bit Parser Configuration" + } + ], "description": "Setup Fluent-Bit parser config file parsing Nginx access log fields", - "content": "[PARSER]\n Name apache\n Format regex\n Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \\[(?

{dataSourceMenuComponent} + [^,]+),(?[^,]+),(?[^,]+),(?[^,]+),(?[^,]+)$\\n Time_Key timestamp\\n Time_Format %Y-%m-%d %H:%M:%S\\n```\\n\\n### Direct the CSV folder location\\n\\nEnsure this file is in the directory you specified in the `Path` of the `fluent-bit.conf` file.\\n\\n\\n## Step 3: Run Fluent Bit\\n\\nNavigate to the directory containing the Fluent Bit executable and the configuration files. Then, start Fluent Bit with the configuration files.\\n\\n```bash\\n/path/to/fluent-bit/bin/fluent-bit -c /path/to/fluent-bit.conf\\n```\\n\\n## Step 4: Verify Data in OpenSearch\\n\\nAfter starting Fluent Bit, you can verify the data ingestion by accessing OpenSearch and searching for the `csv-index` index.\\n\\nFor example, you can use OpenSearch Dashboards or the OpenSearch API to query the index:\\n\\n### Using OpenSearch Dashboards:\\n\\n1. Open OpenSearch Dashboards in your browser.\\n2. Navigate to the \\\"Discover\\\" tab.\\n3. Select the `csv-index` index pattern.\\n4. Verify that the log data from your CSV files is being ingested and displayed.\\n\\n### Using the OpenSearch API:\\n\\n```bash\\ncurl -X GET \\\"http://your-opensearch-host:9200/csv-index/_search?pretty\\\"\\n```\\n\\n---\\n## Live Testing with Docker Compose\\nIf you prefer to test this setup using Docker Compose, you can use the following docker-compose.yml file to quickly set up an OpenSearch instance along with Fluent Bit:\\n\\nUnder the `getting-started` section you can examine a live docker-compose sample:\\n```yaml\\n/csv_file/getting-started/fluent-bit\\n|-- docker-complete.yml\\n|-- data/\\n |-- fluent-bit.conf\\n |-- parsers.conf\\n |-- logs.csv\\n\\n```\\nUse the [docker-compose](../getting-started/fluent-bit/docker-complete.yml) you can find a complete:\\n\\n`docker compose -f docker-complete.yml up -d` would instantiate the services and start sending the csv sample logs into an index. \\n\"}}"},"id":"0fad8910-43d9-11ef-a69e-0549ba61487e","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2024-07-17T16:55:31.713Z","version":"WzEsMV0="} -{"attributes":{"description":"upload a csv file example using fluent-bit agent","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"2.15.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"22a1a11f-7ecf-46c7-a73d-b6cb5eb07b45\"},\"panelIndex\":\"22a1a11f-7ecf-46c7-a73d-b6cb5eb07b45\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"}]","timeRestore":false,"title":"csv-file-upload-fluent-bit-dashboard","version":1},"id":"1e4f1c40-43d9-11ef-a69e-0549ba61487e","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"0fad8910-43d9-11ef-a69e-0549ba61487e","name":"panel_0","type":"visualization"}],"type":"dashboard","updated_at":"2024-07-17T16:55:31.713Z","version":"WzIsMV0="} -{"attributes":{"fields":"[{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"application\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"application.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"application\"}}},{\"count\":0,\"name\":\"host\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"host.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"host\"}}},{\"count\":0,\"name\":\"log_level\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"log_level.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"log_level\"}}},{\"count\":0,\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"message.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"message\"}}},{\"count\":0,\"name\":\"timestamp\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"timestamp.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"timestamp\"}}}]","timeFieldName":"@timestamp","title":"logs-*"},"id":"csv-getting-started-tutorial-1.0.0","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-17T16:59:06.006Z","version":"WzMsMV0="} -{"exportedCount":3,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/server/routes/getting_started/assets/golang-tutorial-1.0.0.ndjson b/server/routes/getting_started/assets/golang-tutorial-1.0.0.ndjson index aff9e74b3..e02f1e958 100644 --- a/server/routes/getting_started/assets/golang-tutorial-1.0.0.ndjson +++ b/server/routes/getting_started/assets/golang-tutorial-1.0.0.ndjson @@ -1,4 +1,2 @@ -{"attributes":{"description":"golang client getting started applicative log tutorial for logging applicative telemetry data in golang language to opensearch","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"golang client getting started","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"golang client getting started\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":12,\"openLinksInNewTab\":false,\"markdown\":\"# Golang Client Integration\\nThe next integration contains instructions and tutorial of setting up golang opensearch client and logging applicative telemetry into opensearch.\\n\\n## OpenSearch Go Client Documentation\\n\\nThe OpenSearch Go client allows you to connect your Go application with the data in your OpenSearch cluster.\\nThis guide illustrates how to connect to OpenSearch, index documents, and run queries.\\n\\n## Setup\\n\\nTo start a new project:\\n```bash\\ngo mod init \\n```\\nAdd the Go client to your project:\\n```bash\\ngo get github.com/opensearch-project/opensearch-go\\n```\\n\\n## Connecting to OpenSearch\\n\\nTo connect to the default OpenSearch host, create a client object with the address https://localhost:9200\\nIf using the Security plugin:\\n\\n```go\\nclient, err := opensearch.NewClient(opensearch.Config{\\n Transport: &http.Transport{\\n TLSClientConfig: &tls.Config{InsecureSkipVerify: true},\\n },\\n Addresses: []string{\\\"https://localhost:9200\\\"},\\n Username: \\\"admin\\\", // For testing only. Don't store credentials in code.\\n Password: \\\"admin\\\",\\n})\\n```\\nWithout the Security plugin:\\n```go\\nclient, err := opensearch.NewClient(opensearch.Config{\\n Transport: &http.Transport{\\n TLSClientConfig: &tls.Config{InsecureSkipVerify: true},\\n },\\n Addresses: []string{\\\"http://localhost:9200\\\"},\\n})\\n```\\n\\n## Creating an Index\\n\\nTo create an index:\\n```go\\nsettings := strings.NewReader(`{\\n \\\"settings\\\": {\\n \\\"index\\\": {\\n \\\"number_of_shards\\\": 1,\\n \\\"number_of_replicas\\\": 0\\n }\\n }\\n}`)\\n\\nres := opensearchapi.IndicesCreateRequest{\\n Index: \\\"go-test-index1\\\",\\n Body: settings,\\n}\\n```\\n\\n## Indexing a Document\\n\\nTo index a document:\\n```go\\ndocument := strings.NewReader(`{\\n \\\"title\\\": \\\"Moneyball\\\",\\n \\\"director\\\": \\\"Bennett Miller\\\",\\n \\\"year\\\": \\\"2011\\\"\\n}`)\\n\\ndocId := \\\"1\\\"\\nreq := opensearchapi.IndexRequest{\\n Index: \\\"go-test-index1\\\",\\n DocumentID: docId,\\n Body: document,\\n}\\ninsertResponse, err := req.Do(context.Background(), client)\\n```\\n\\n## Performing Bulk Operations\\n\\nTo perform bulk operations:\\n```go\\nblk, err := client.Bulk(\\n strings.NewReader(`\\n { \\\"index\\\" : { \\\"_index\\\" : \\\"go-test-index1\\\", \\\"_id\\\" : \\\"2\\\" } }\\n { \\\"title\\\" : \\\"Interstellar\\\", \\\"director\\\" : \\\"Christopher Nolan\\\", \\\"year\\\" : \\\"2014\\\"}\\n { \\\"create\\\" : { \\\"_index\\\" : \\\"go-test-index1\\\", \\\"_id\\\" : \\\"3\\\" } }\\n { \\\"title\\\" : \\\"Star Trek Beyond\\\", \\\"director\\\" : \\\"Justin Lin\\\", \\\"year\\\" : \\\"2015\\\"}\\n { \\\"update\\\" : {\\\"_id\\\" : \\\"3\\\", \\\"_index\\\" : \\\"go-test-index1\\\" } }\\n { \\\"doc\\\" : {\\\"year\\\" : \\\"2016\\\"} }\\n`),\\n)\\n```\\n\\n## Searching for Documents\\n\\nTo search for documents:\\n```go\\ncontent := strings.NewReader(`{\\n \\\"size\\\": 5,\\n \\\"query\\\": {\\n \\\"multi_match\\\": {\\n \\\"query\\\": \\\"miller\\\",\\n \\\"fields\\\": [\\\"title^2\\\", \\\"director\\\"]\\n }\\n }\\n}`)\\n\\nsearch := opensearchapi.SearchRequest{\\n Index: []string{\\\"go-test-index1\\\"},\\n Body: content,\\n}\\n\\nsearchResponse, err := search.Do(context.Background(), client)\\n```\\n\\nIn order to log Applicative activities, generate a log entry struct that collects applicative telemetry :\\n```\\ntype LogEntry struct {\\n Timestamp string `json:\\\"timestamp\\\"`\\n Level string `json:\\\"level\\\"`\\n Message string `json:\\\"message\\\"`\\n Source string `json:\\\"source\\\"`\\n Module string `json:\\\"module\\\"`\\n Function string `json:\\\"function\\\"`\\n UserID string `json:\\\"user_id\\\"`\\n}\\n```\\nThis would log into a dedicated applicative index for storing the application's telemetry info\\n\\n\\nHere is a complete sample application:\\n\\n```\\npackage main\\n\\nimport (\\n \\\"context\\\"\\n \\\"crypto/tls\\\"\\n \\\"encoding/json\\\"\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n \\\"time\\\"\\n\\n opensearch \\\"github.com/opensearch-project/opensearch-go\\\"\\n opensearchapi \\\"github.com/opensearch-project/opensearch-go/opensearchapi\\\"\\n)\\n\\n// LogEntry represents the structure of the log entry\\ntype LogEntry struct {\\n Timestamp string `json:\\\"timestamp\\\"`\\n Level string `json:\\\"level\\\"`\\n Message string `json:\\\"message\\\"`\\n Source string `json:\\\"source\\\"`\\n Module string `json:\\\"module\\\"`\\n Function string `json:\\\"function\\\"`\\n UserID string `json:\\\"user_id\\\"`\\n}\\n\\n// InitOpenSearchClient initializes the OpenSearch client\\nfunc InitOpenSearchClient() (*opensearch.Client, error) {\\n client, err := opensearch.NewClient(opensearch.Config{\\n Transport: &http.Transport{\\n TLSClientConfig: &tls.Config{InsecureSkipVerify: true},\\n },\\n Addresses: []string{\\\"https://localhost:9200\\\"},\\n Username: \\\"admin\\\",\\n Password: \\\"admin\\\",\\n })\\n if err != nil {\\n return nil, fmt.Errorf(\\\"failed to create OpenSearch client: %w\\\", err)\\n }\\n return client, nil\\n}\\n\\n// LogToOpenSearch logs the provided entry to OpenSearch\\nfunc LogToOpenSearch(client *opensearch.Client, entry LogEntry) error {\\n data, err := json.Marshal(entry)\\n if err != nil {\\n return fmt.Errorf(\\\"failed to marshal log entry: %w\\\", err)\\n }\\n\\n req := opensearchapi.IndexRequest{\\n Index: \\\"logs\\\",\\n DocumentID: fmt.Sprintf(\\\"%d\\\", time.Now().UnixNano()),\\n Body: strings.NewReader(string(data)),\\n }\\n\\n res, err := req.Do(context.Background(), client)\\n if err != nil {\\n return fmt.Errorf(\\\"failed to index log entry: %w\\\", err)\\n }\\n defer res.Body.Close()\\n\\n if res.IsError() {\\n return fmt.Errorf(\\\"error indexing log entry: %s\\\", res.String())\\n }\\n\\n return nil\\n}\\n\\nfunc main() {\\n client, err := InitOpenSearchClient()\\n if err != nil {\\n log.Fatalf(\\\"Error initializing OpenSearch client: %s\\\", err)\\n }\\n\\n logEntry := LogEntry{\\n Timestamp: \\\"2024-02-05T12:05:00\\\",\\n Level: \\\"info\\\",\\n Message: \\\"Processing user request.\\\",\\n Source: \\\"your_project\\\",\\n Module: \\\"request_handler\\\",\\n Function: \\\"process_request\\\",\\n UserID: \\\"user_123\\\",\\n }\\n\\n err = LogToOpenSearch(client, logEntry)\\n if err != nil {\\n log.Fatalf(\\\"Error logging to OpenSearch: %s\\\", err)\\n }\\n\\n log.Println(\\\"Log entry successfully written to OpenSearch\\\")\\n}\\n```\\n\\n## Best Practices for Effective Logging\\n\\n1. **Descriptive Log Messages**: Include clear and detailed information.\\n2. **Appropriate Log Levels**: Use different levels (INFO, DEBUG, ERROR) to categorize log messages.\\n3. **Timestamps**: Always include timestamps for chronological analysis.\\n4. **Contextual Information**: Add details like module, function, or user IDs.\\n5. **Avoid Redundant Logging**: Balance between sufficient information and avoiding overload.\\n6. **Secure Sensitive Information**: Do not log sensitive data in plain text.\\n7. **Structured Logging**: Use JSON for consistent log formats.\\n\\n## Advanced Features of OpenSearch\\n\\n- **Index Patterns and Mappings**: Optimize log data structure for better analysis and retrieval.\\n- **Visualization with Dashboards**: Create interactive dashboards for real-time log insights.\\n\\n# How to build an Application Monitor Dashboard\\nBased on the ingested logs, lets review the process of generating an informative monitor dashboard for the applicative logs:\\n\\n## Step-by-Step Tutorial: Creating an OpenSearch Dashboard for Application Logs\\n\\n### 1. Log in to opensearch dashboards\\n- Navigate to OpenSearch Dashboards.\\n- Log in and verify the logs index was created and contains logs data\\n- Go to Discover tab, select the index name and view the data\\n\\n### 2. Create an Index Pattern\\n- Go to 'Management' > 'Index Patterns'.\\n- Click 'Create Index Pattern' and enter the pattern (e.g., logs-*).\\n- Select the timestamp field (e.g., @timestamp) for time-based data.\\n- Save the index pattern.\\n\\n### 3. Build Log Queries\\n- Go to the 'Discover' tab.\\n- Use the search bar to filter logs, e.g., `log_level:ERROR` to find all error logs.\\n- For advanced filtering, utilize the Dashboard Query Language (DQL).\\n\\n### 4. Save Your Query\\n- After refining your query, save it by clicking on the 'Save' button in the 'Discover' tab.\\n- Name your saved query for easy reference.\\n\\n### 5. Create Visualizations\\n- Go to 'Visualize' > 'Create Visualization'.\\n- Select the type of visualization you want to create (e.g., bar chart, pie chart).\\n- Choose your saved query as the data source.\\n\\n### 6. Add Buckets for Data Aggregation\\n- In the visualization settings, add buckets to aggregate your data. For example:\\n - Use 'Date Histogram' for the X-axis to display logs over time.\\n - Add other metrics or aggregations as needed.\\n\\n### 7. Split Series for Detailed Insights\\n- Add another bucket to split data by specific fields, such as `service.name` or `host.name`.\\n- This will allow you to see log distributions across different services or hosts.\\n\\n### 8. Customize Visualization\\n- Customize the visualization with labels, colors, and other settings to make it more informative and visually appealing.\\n\\n### 9. Save and Add to Dashboard\\n- Save the visualization with a descriptive name.\\n- Navigate to the 'Dashboard' tab and create a new dashboard.\\n- Add your saved visualizations to the dashboard by selecting them from the list.\\n\\n### 10. Finalize and Share\\n- Arrange the visualizations on the dashboard as desired.\\n- Save the dashboard with a meaningful name.\\n- Share the dashboard with your team by generating a shareable link or embedding it in your application.\\n\\n### Tips for Effective Dashboards\\n- Use different types of visualizations to present various aspects of your log data.\\n- Regularly update the time filter to ensure you're viewing the most recent logs.\\n- Take advantage of OpenSearch Dashboards' interactive features, such as drill-downs and filters, for deeper analysis.\\n\\n\"}}"},"id":"37dbabf0-3ff7-11ef-a406-af6eb3c84d77","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2024-07-12T02:34:09.838Z","version":"WzQxLDVd"} -{"attributes":{"description":"golang client getting started applicative log tutorial for logging applicative telemetry data in golang language to opensearch","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"2.15.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"b7e27081-5e45-44c7-bdb4-ea02a793be38\"},\"panelIndex\":\"b7e27081-5e45-44c7-bdb4-ea02a793be38\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"}]","timeRestore":false,"title":"golang client getting started dashboard","version":1},"id":"golang-getting-started-tutorial-1.0.0","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"37dbabf0-3ff7-11ef-a406-af6eb3c84d77","name":"panel_0","type":"visualization"}],"type":"dashboard","updated_at":"2024-07-12T02:34:24.241Z","version":"WzQyLDVd"} {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"error_code\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"function\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"level\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"module\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"source\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"user_id\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"applicative_logs*"},"id":"15746330-447b-11ef-99f2-2b48f7e65060","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-17T20:28:10.338Z","version":"WzUsMV0="} -{"exportedCount":3,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file +{"exportedCount":1,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/server/routes/getting_started/assets/java-tutorial-1.0.0.ndjson b/server/routes/getting_started/assets/java-tutorial-1.0.0.ndjson index db3e06e8b..1da61780e 100644 --- a/server/routes/getting_started/assets/java-tutorial-1.0.0.ndjson +++ b/server/routes/getting_started/assets/java-tutorial-1.0.0.ndjson @@ -1,4 +1,2 @@ -{"attributes":{"description":"Getting started for java client instructions v","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"java_client","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"java_client\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":12,\"openLinksInNewTab\":false,\"markdown\":\"Here's a similar getting started guide for Java based on the provided Python instructions.\\n\\n# Java Client Integration\\n\\nThis guide provides instructions and a tutorial on setting up the Java OpenSearch client and logging application telemetry into OpenSearch.\\n\\n## Logging with OpenSearch in Java:\\n\\nLogging is an important aspect of software development, and OpenSearch is a robust and scalable solution for storing and analyzing logs efficiently. This guide walks you through integrating OpenSearch as a storage and analytics component in your Java project for effective logging.\\n\\n### Install Java Libraries\\n\\nAdd the OpenSearch Java client to your Maven project's `pom.xml` to interact with OpenSearch:\\n\\n```xml\\n\\n org.opensearch.client\\n opensearch-rest-client\\n 2.15.0\\n\\n\\n\\n org.opensearch.client\\n opensearch-java\\n 2.6.0\\n\\n```\\nSee additional documentation [here](https://opensearch.org/docs/latest/clients/java/).\\n\\n## Integrating OpenSearch with Your Java Project\\n\\n### Step 1: Import the OpenSearch Client\\n\\nIn your Java project, use a class called IndexData, which is a simple Java class that stores basic data and methods.\\nFor your own OpenSearch cluster, you might find that you need a more robust class to store your data.\\n\\n\\n\\n```java\\nstatic class IndexData {\\n private String firstName;\\n private String lastName;\\n\\n public IndexData(String firstName, String lastName) {\\n this.firstName = firstName;\\n this.lastName = lastName;\\n }\\n\\n public String getFirstName() {\\n return firstName;\\n }\\n\\n public void setFirstName(String firstName) {\\n this.firstName = firstName;\\n }\\n\\n public String getLastName() {\\n return lastName;\\n }\\n\\n public void setLastName(String lastName) {\\n this.lastName = lastName;\\n }\\n\\n @Override\\n public String toString() {\\n return String.format(\\\"IndexData{first name='%s', last name='%s'}\\\", firstName, lastName);\\n }\\n}\\n```\\n\\n### Step 2: Establish a Connection\\n\\nInitializing the client with SSL and TLS enabled using RestClient Transport\\nThis code example uses basic credentials that come with the default OpenSearch configuration.\\nIf you’re using the Java client with your own OpenSearch cluster, be sure to change the code so that it uses your own credentials.\\n\\n\\n```java\\nimport org.apache.http.HttpHost;\\nimport org.apache.http.auth.AuthScope;\\nimport org.apache.http.auth.UsernamePasswordCredentials;\\nimport org.apache.http.impl.nio.client.HttpAsyncClientBuilder;\\nimport org.apache.http.impl.client.BasicCredentialsProvider;\\nimport org.opensearch.client.RestClient;\\nimport org.opensearch.client.RestClientBuilder;\\nimport org.opensearch.client.json.jackson.JacksonJsonpMapper;\\nimport org.opensearch.client.opensearch.OpenSearchClient;\\nimport org.opensearch.client.transport.OpenSearchTransport;\\nimport org.opensearch.client.transport.rest_client.RestClientTransport;\\n\\npublic class OpenSearchClientExample {\\n public static void main(String[] args) throws Exception {\\n System.setProperty(\\\"javax.net.ssl.trustStore\\\", \\\"/full/path/to/keystore\\\");\\n System.setProperty(\\\"javax.net.ssl.trustStorePassword\\\", \\\"password-to-keystore\\\");\\n\\n final HttpHost host = new HttpHost(\\\"https\\\", \\\"localhost\\\", 9200);\\n final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();\\n //Only for demo purposes. Don't specify your credentials in code.\\n credentialsProvider.setCredentials(new AuthScope(host), new UsernamePasswordCredentials(\\\"admin\\\", \\\"admin\\\".toCharArray()));\\n\\n //Initialize the client with SSL and TLS enabled\\n final RestClient restClient = RestClient.builder(host).\\n setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {\\n @Override\\n public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {\\n return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);\\n }\\n }).build();\\n\\n final OpenSearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());\\n final OpenSearchClient client = new OpenSearchClient(transport);\\n }\\n}\\n```\\n\\n### Step 3: Indexing Logs\\nYou can create an index with non-default settings using the following code:\\n```java\\nString index = \\\"sample-index\\\";\\n CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index).build();\\n client.indices().create(createIndexRequest);\\n\\n IndexSettings indexSettings = new IndexSettings.Builder().autoExpandReplicas(\\\"0-all\\\").build();\\n PutIndicesSettingsRequest putIndicesSettingsRequest = new PutIndicesSettingsRequest.Builder().index(index).value(indexSettings).build();\\n client.indices().putSettings(putIndicesSettingsRequest);\\n```\\n\\nIndex your logs into OpenSearch:\\n\\n```java\\nIndexData indexData = new IndexData(\\\"first_name\\\", \\\"Bruce\\\");\\nIndexRequest indexRequest = new IndexRequest.Builder().index(index).id(\\\"1\\\").document(indexData).build();\\nclient.index(indexRequest);\\n```\\n\\n### Step 4: Querying Logs\\n\\nRetrieve logs using OpenSearch's powerful search capabilities:\\n\\n```java\\nSearchResponse searchResponse = client.search(s -> s.index(index), IndexData.class);\\nfor (int i = 0; i< searchResponse.hits().hits().size(); i++) {\\n System.out.println(searchResponse.hits().hits().get(i).source());\\n }\\n```\\n\\n## Best Practices for Effective Logging\\n\\n1. **Descriptive Log Messages**: Include clear and detailed information.\\n2. **Appropriate Log Levels**: Use different levels (INFO, DEBUG, ERROR) to categorize log messages.\\n3. **Timestamps**: Always include timestamps for chronological analysis.\\n4. **Contextual Information**: Add details like module, function, or user IDs.\\n5. **Avoid Redundant Logging**: Balance between sufficient information and avoiding overload.\\n6. **Secure Sensitive Information**: Do not log sensitive data in plain text.\\n7. **Structured Logging**: Use JSON for consistent log formats.\\n\\n## Advanced Features of OpenSearch\\n\\n- **Index Patterns and Mappings**: Optimize log data structure for better analysis and retrieval.\\n- **Visualization with Dashboards**: Create interactive dashboards for real-time log insights.\\n\\n# How to build an Application Monitor Dashboard\\n\\nBased on the ingested logs, let's review the process of generating an informative monitor dashboard for the application logs:\\n\\n## Step-by-Step Tutorial: Creating an OpenSearch Dashboard for Application Logs\\n\\n### 1. Log in to OpenSearch Dashboards\\n\\n- Navigate to OpenSearch Dashboards.\\n- Log in and verify the logs index was created and contains logs data.\\n- Go to the Discover tab, select the index name, and view the data.\\n\\n### 2. Create an Index Pattern\\n\\n- Go to 'Management' > 'Index Patterns'.\\n- Click 'Create Index Pattern' and enter the pattern (e.g., logs-*).\\n- Select the timestamp field (e.g., @timestamp) for time-based data.\\n- Save the index pattern.\\n\\n### 3. Build Log Queries\\n\\n- Go to the 'Discover' tab.\\n- Use the search bar to filter logs, e.g., `log_level:ERROR` to find all error logs.\\n- For advanced filtering, utilize the Dashboard Query Language (DQL).\\n\\n### 4. Save Your Query\\n\\n- After refining your query, save it by clicking on the 'Save' button in the 'Discover' tab.\\n- Name your saved query for easy reference.\\n\\n### 5. Create Visualizations\\n\\n- Go to 'Visualize' > 'Create Visualization'.\\n- Select the type of visualization you want to create (e.g., bar chart, pie chart).\\n- Choose your saved query as the data source.\\n\\n### 6. Add Buckets for Data Aggregation\\n\\n- In the visualization settings, add buckets to aggregate your data. For example:\\n - Use 'Date Histogram' for the X-axis to display logs over time.\\n - Add other metrics or aggregations as needed.\\n\\n### 7. Split Series for Detailed Insights\\n\\n- Add another bucket to split data by specific fields, such as `service.name` or `host.name`.\\n- This will allow you to see log distributions across different services or hosts.\\n\\n### 8. Customize Visualization\\n\\n- Customize the visualization with labels, colors, and other settings to make it more informative and visually appealing.\\n\\n### 9. Save and Add to Dashboard\\n\\n- Save the visualization with a descriptive name.\\n- Navigate to the 'Dashboard' tab and create a new dashboard.\\n- Add your saved visualizations to the dashboard by selecting them from the list.\\n\\n### 10. Finalize and Share\\n\\n- Arrange the visualizations on the dashboard as desired.\\n- Save the dashboard with a meaningful name.\\n- Share the dashboard with your team by generating a shareable link or embedding it in your application.\\n\\n### Tips for Effective Dashboards\\n\\n- Use different types of visualizations to present various aspects of your log data.\\n- Regularly update the time filter to ensure you're viewing the most recent logs.\\n- Take advantage of OpenSearch Dashboards' interactive features, such as drill-downs and filters, for deeper analysis.\"}}"},"id":"128d0790-47e5-11ef-89c9-a5eb94f3bbbc","migrationVersion":{"visualization":"7.10.0"},"references":[],"type":"visualization","updated_at":"2024-07-22T04:44:25.609Z","version":"WzcyLDdd"} -{"attributes":{"description":"getting started instructions for a java client based applicative logs dashboard","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"2.15.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":15,\"i\":\"39184cd8-b84d-48c8-821d-f749007e8bd0\"},\"panelIndex\":\"39184cd8-b84d-48c8-821d-f749007e8bd0\",\"embeddableConfig\":{},\"panelRefName\":\"panel_0\"}]","timeRestore":false,"title":"java_client-dashboard","version":1},"id":"java_client_getting-started-dashboard","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"128d0790-47e5-11ef-89c9-a5eb94f3bbbc","name":"panel_0","type":"visualization"}],"type":"dashboard","updated_at":"2024-07-22T04:44:54.511Z","version":"WzczLDdd"} {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"error_code\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"function\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"level\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"module\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"source\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"user_id\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","timeFieldName":"timestamp","title":"applicative_logs*"},"id":"15746330-447b-11ef-99f2-2b48f7e65060","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-19T21:03:51.880Z","version":"WzIxLDJd"} -{"exportedCount":3,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file +{"exportedCount":1,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/server/routes/getting_started/assets/nginx-1.0.0.ndjson b/server/routes/getting_started/assets/nginx-1.0.0.ndjson index fc472d5e9..7dc3b6809 100644 --- a/server/routes/getting_started/assets/nginx-1.0.0.ndjson +++ b/server/routes/getting_started/assets/nginx-1.0.0.ndjson @@ -1,13 +1,2 @@ {"attributes":{"fields":"[{\"count\":0,\"name\":\"@message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"attributes.data_stream.dataset\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.namespace\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"body\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.address\"}}},{\"count\":0,\"name\":\"communication.destination.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.domain\"}}},{\"count\":0,\"name\":\"communication.destination.geo.city_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_iso_code\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.location\",\"type\":\"geo_point\",\"esTypes\":[\"geo_point\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.sock.family\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.address\"}}},{\"count\":0,\"name\":\"communication.source.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.domain\"}}},{\"count\":0,\"name\":\"communication.source.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.category\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.domain\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.message\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.stacktrace\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"event.exception.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.kind\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.result\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.source\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.client.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.flavor\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.request.id\"}}},{\"count\":0,\"name\":\"http.request.method\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.mime_type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.referrer\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.resent_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.response.id\"}}},{\"count\":0,\"name\":\"http.response.status_code\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.route\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.schema\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.target\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.url\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.user_agent\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.dropped_attributes_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.name.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.name\"}}},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.schemaUrl\"}}},{\"count\":0,\"name\":\"instrumentationScope.version\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.version.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.version\"}}},{\"count\":0,\"name\":\"observedTimestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"observerTime\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"schemaUrl\"}}},{\"count\":0,\"name\":\"severity.number\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"severity.text\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"severity.text.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"severity.text\"}}},{\"count\":0,\"name\":\"spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"span_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"span_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"span_id\"}}},{\"count\":0,\"name\":\"traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"trace_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trace_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trace_id\"}}}]","timeFieldName":"@timestamp","title":"ss4o_logs-nginx-*"},"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-11-06T06:10:10.775Z","version":"WzExOSwxXQ=="} -{"attributes":{"columns":["http.request.method","http.response.status_code"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"event.domain:nginx.access\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"[NGINX Core Logs 1.0] Nginx Access Logs","version":1},"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","migrationVersion":{"search":"7.9.3"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMCwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Response codes over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Response codes over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"filters\",\"params\":{\"filters\":[{\"input\":{\"query\":\"http.response.status_code:[200 TO 299]\",\"language\":\"lucene\"},\"label\":\"200s\"},{\"input\":{\"query\":\"http.response.status_code:[300 TO 399]\",\"language\":\"lucene\"},\"label\":\"300s\"},{\"input\":{\"query\":\"http.response.status_code:[400 TO 499]\",\"language\":\"lucene\"},\"label\":\"400s\"},{\"input\":{\"query\":\"http.response.status_code:[500 TO 599]\",\"language\":\"lucene\"},\"label\":\"500s\"},{\"input\":{\"query\":\"http.response.status_code:0\",\"language\":\"lucene\"},\"label\":\"0\"}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"feb24bf8-f5e4-4f24-a9e0-c6618a8db3c3","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMSwxXQ=="} -{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"query\":{\"query\":\"http.response.status_code >= 300 and event.domain:nginx.access\",\"language\":\"kuery\"},\"version\":true,\"highlight\":{\"post_tags\":[\"@/kibana-highlighted-field@\"],\"fields\":{\"*\":{}},\"pre_tags\":[\"@kibana-highlighted-field@\"],\"require_field_match\":false,\"fragment_size\":2147483647},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"[NGINX Core Logs 1.0] Nginx Error Logs","version":1},"id":"aae90f71-83e6-4154-83f8-80185a58cde7","migrationVersion":{"search":"7.9.3"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMiwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Errors over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Errors over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"bfa0e172-75fa-485d-aebd-b623713359b3","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"aae90f71-83e6-4154-83f8-80185a58cde7","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMywxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"HTTP Top URLs","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"HTTP Top URLs\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.url\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"69b27677-9127-4581-9f1a-cc3a84822354","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyNSwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Data Volume","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Data Volume\",\"type\":\"area\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"params\":{\"field\":\"http.response.bytes\",\"customLabel\":\"Response Bytes\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-15m\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"m\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Response Bytes\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Response Bytes\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"labels\":{}}}"},"id":"de792cf1-b1f1-4705-890d-4206709c7360","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyNCwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"Status code dropdown","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Status code dropdown\",\"type\":\"input_control_vis\",\"aggs\":[],\"params\":{\"controls\":[{\"id\":\"1700045798676\",\"fieldName\":\"http.response.status_code\",\"parent\":\"\",\"label\":\"Dropdown\",\"type\":\"list\",\"options\":{\"type\":\"terms\",\"multiselect\":true,\"dynamicOptions\":true,\"size\":5,\"order\":\"desc\"},\"indexPatternRefName\":\"control_0_index_pattern\"}],\"updateFiltersOnChange\":false,\"useTimeFilter\":false,\"pinFilters\":false}}"},"id":"c4fcd310-83a5-11ee-8c8a-a1faaf8536ee","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"control_0_index_pattern","type":"index-pattern"}],"type":"visualization","updated_at":"2023-11-15T10:57:29.280Z","version":"WzEyNywxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Transactions by API","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Transactions by API\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.url\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"\"},\"schema\":\"bucket\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.response.status_code\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"0e69fad0-76ec-11ee-8c8a-a1faaf8536ee","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-16T05:08:59.573Z","version":"WzEzMCwxXQ=="} -{"attributes":{"description":"Nginx dashboard with basic Observability on access / error logs","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":8,\"i\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"w\":48,\"x\":0,\"y\":15},\"panelIndex\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"title\":\"HTTP Status Codes over Time\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":9,\"i\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"w\":24,\"x\":0,\"y\":23},\"panelIndex\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"title\":\"HTTP Errors over Time\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{\"vis\":{\"sortColumn\":{\"colIndex\":0,\"direction\":\"asc\"}}},\"gridData\":{\"h\":15,\"i\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\",\"w\":24,\"x\":24,\"y\":23},\"panelIndex\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":15,\"i\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"w\":24,\"x\":0,\"y\":32},\"panelIndex\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"title\":\"HTTP Data Volume\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"742783de-3ed5-4ba8-aafd-948220697bc6\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"742783de-3ed5-4ba8-aafd-948220697bc6\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"8f9de824-cffd-43d1-b59e-8912ec9da1c5\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"8f9de824-cffd-43d1-b59e-8912ec9da1c5\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_5\"}]","refreshInterval":{"pause":true,"value":0},"timeFrom":"now-90d","timeRestore":true,"timeTo":"now","title":"Nginx Logs Overview","version":1},"id":"nginx-dashboard-1.0.0","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"feb24bf8-f5e4-4f24-a9e0-c6618a8db3c3","name":"panel_0","type":"visualization"},{"id":"bfa0e172-75fa-485d-aebd-b623713359b3","name":"panel_1","type":"visualization"},{"id":"69b27677-9127-4581-9f1a-cc3a84822354","name":"panel_2","type":"visualization"},{"id":"de792cf1-b1f1-4705-890d-4206709c7360","name":"panel_3","type":"visualization"},{"id":"c4fcd310-83a5-11ee-8c8a-a1faaf8536ee","name":"panel_4","type":"visualization"},{"id":"0e69fad0-76ec-11ee-8c8a-a1faaf8536ee","name":"panel_5","type":"visualization"}],"type":"dashboard","updated_at":"2023-11-16T05:16:26.850Z","version":"WzEzMiwxXQ=="} -{"attributes":{"description":"Getting started tutorial for Nginx & Fluent Bit agent collecting access logs and shipping into opensearch after transformation into SS4O logs specification","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"Nginx-Flunent-Bit-Getting-Started","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Nginx-Flunent-Bit-Getting-Started\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":12,\"openLinksInNewTab\":false,\"markdown\":\"# Getting Started with Nginx Ingestion using Fluent Bit\\n\\nThis tutorial covers two different setups processes for getting started with Nginx ingestion: a live example using Docker and a self-managed setup with code snippets.\\n\\n## Live Example using Docker\\n\\n### Step 1: Create Docker Network\\nBefore running any Docker Compose files, create the Docker network.\\n```sh\\ndocker network create opensearch-net\\n```\\n\\n**Description**:\\nCreate a Docker network named opensearch-net for the OpenSearch and fluent-bit containers to communicate.\\nUse this specific command if your existing `opensearch` & `opensearch-dashboards` are already running within a docker-compose container.\\n\\nIf `opensearch` & `opensearch-dashboards` are running outside of a container scope - for example in your `localhost`, change the original docker network definition Into the following:\\n```yaml\\n network_mode: host\\n```\\n\\n### Step 2: Setup Docker `.env` File\\nDownload and set up the environment variables.\\n```sh\\nwget https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/.env\\n```\\n\\n**Description**:\\nThe .env file contains environment variables required for Docker Compose to configure the OpenSearch and Fluent-Bit containers.\\n\\nUpdate the following parameters:\\n\\n```yaml\\n# OpenSearch Node1\\nOPENSEARCH_PORT=9200\\nOPENSEARCH_HOST=opensearch\\nOPENSEARCH_ADDR=${OPENSEARCH_HOST}:${OPENSEARCH_PORT}\\n\\n# OpenSearch Dashboard\\nOPENSEARCH_DASHBOARD_PORT=5601\\nOPENSEARCH_DASHBOARD_HOST=opensearch-dashboards\\nOPENSEARCH_DASHBOARD_ADDR=${OPENSEARCH_DASHBOARD_HOST}:${OPENSEARCH_DASHBOARD_PORT}\\n```\\n\\nIf running `opensearch` & `opensearch-dashboards` are running outside of a container scope - also update the host names `OPENSEARCH_HOST`, `OPENSEARCH_DASHBOARD_HOST` appearing in the .env file to be able to recognize your local running services.\\n\\n### Step 3: Setup Fluent Bit Folder\\nDownload the Fluent Bit configuration files.\\n```sh\\nwget https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/fluent-bit.conf \\\\\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/otel-converter.lua \\\\\\n https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/fluent-bit/parsers.conf\\n```\\n\\n**Description**:\\nGet the local fluent-bit relevant config files.\\n- Update the `Host` field to match the `opensearch` location - in case its not a part of a docker-compose service, or host name as defined by the docker-compose running your server\\n- Update the `Index` field to match the index naming specification as defined by the [simple schema for observability](https://github.com/opensearch-project/opensearch-catalog/blob/main/docs/schema/observability/Naming-convention.md).\\n\\n```yaml\\n\\n[OUTPUT]\\n Name opensearch\\n Match nginx.access\\n Host opensearch-node1\\n Port 9200\\n Index ss4o_logs-nginx-prod\\n Suppress_Type_Name On\\n tls On\\n tls.verify Off\\n HTTP_User admin\\n HTTP_Passwd my_%New%_passW0rd!@#\\n\\n[OUTPUT]\\n Name opensearch\\n Match apache.access\\n Host opensearch-node1\\n Port 9200\\n Index ss4o_logs-apache-prod\\n Suppress_Type_Name On\\n tls On\\n tls.verify Off\\n HTTP_User admin\\n HTTP_Passwd my_%New%_passW0rd!@#\\n\\n```\\n\\n\\n### Step 4: Run Docker Compose\\nDownload and run the Docker Compose file for the Nginx live example.\\n\\n```sh\\nwget -O nginx-node.yml https://raw.githubusercontent.com/opensearch-project/opensearch-catalog/main/integrations/observability/nginx/getting-started/nginx-node.yml\\n\\ndocker-compose -f nginx-node.yml up -d\\n```\\n**Description**:\\nRun the nginx-node docker compose after updating the `networks` definition to accommodate your existing `opensearch` service.\\n```yaml\\nnetworks:\\n opensearch-net:\\n external: true\\n```\\n\\n## Self-Managed Setup\\n\\nThe next part describe the details for manually updating the `fluent-bit` agent for running along-side the `nginx` service and transforming its logs\\ninto `simple schema for observability ` compliant json to be ingested into opensearch.\\n> All the files are present in the `getting-started` folder of this integration.\\n\\n### Step 1: Fluent Bit Parser\\nSet up the Fluent Bit parser configuration to parse Nginx access log fields.\\n\\n**parsers.conf**\\n```ini\\n[PARSER]\\n Name apache\\n Format regex\\n Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \\\\[(?