Skip to content

OpenSearch plugin - initial commit#27

Open
richbenwell wants to merge 8 commits intomainfrom
work/rb/opensearch
Open

OpenSearch plugin - initial commit#27
richbenwell wants to merge 8 commits intomainfrom
work/rb/opensearch

Conversation

@richbenwell
Copy link
Contributor

🔌 Plugin overview

  • Plugin name: OpenSearch
  • Purpose / problem solved: Query data from OpenSearch databases
  • Primary audience (e.g. platform teams, SREs, product teams): Platform/SRE
  • Authentication method(s) (e.g. OAuth, Username/Password, API Key): Username/Password

🖼️ Plugin screenshots

Plugin configuration

Screenshot 2026-02-10 at 10 19 10 pm

Default dashboards

No default dashboards

🧪 Testing

Tested against a deployment of OpenSearch environment for OpenTelemetry logging.


⚠️ Known limitations

  • Currently only supports 'cloud' connection mode, not 'hybrid'
  • Support for 'raw' Query DSL JSON only.

📚 Checklist

  • Plugin, datastream and UI naming follow SquaredUp guidelines
  • Logo added
  • [N/A] One or more dashboards added
  • README added including configuration guidance
  • No secrets or credentials included
  • I agree to the Code of Conduct

Copilot AI review requested due to automatic review settings February 11, 2026 03:20
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an initial community plugin for querying OpenSearch, built on the WebAPI base plugin, with UI configuration plus search/index data streams.

Changes:

  • Introduces OpenSearch plugin metadata, configuration UI, and icon.
  • Adds data streams for listing indices and performing _search, including a post-processing script.
  • Adds initial documentation content for setup/usage.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
plugins/OpenSearch/v1/ui.json Adds data source configuration fields (instance URL, auth mode, basic creds, TLS ignore).
plugins/OpenSearch/v1/metadata.json Declares plugin metadata and WebAPI base configuration.
plugins/OpenSearch/v1/icon.svg Adds plugin icon asset.
plugins/OpenSearch/v1/docs/setup.md Adds setup guidance content (currently not in the standard docs location).
plugins/OpenSearch/v1/dataStreams/search.json Adds _search data stream with index selection + JSON query body.
plugins/OpenSearch/v1/dataStreams/scripts/search.js Adds response shaping for aggregations vs hits.
plugins/OpenSearch/v1/dataStreams/indices.json Adds hidden indices data stream used for index autocomplete.
plugins/OpenSearch/v1/README.md Adds a short top-level README (not in the standard embedded docs path).

Comment on lines +2 to +4
"name": "search",
"displayName": "Search",
"baseDataSourceName": "httpRequestUnscoped",
Copy link

Copilot AI Feb 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data stream displayName should be noun-based per repo guidelines; Search reads as a verb/action. Consider renaming to something like "Search results"/"Results" (whatever best matches the returned shape).

Copilot generated this review using guidance from repository custom instructions.
Comment on lines +5 to +8
"author": {
"name": "SquaredUp Labs",
"type": "labs"
},
Copy link

Copilot AI Feb 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

author.type is set to "labs", but repository guidance and existing plugins use "community" for community-authored plugins. Please update author.type to community and set author.name to a GitHub username (e.g. @username) or an organisation name.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +3
## Overview

Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries.
Copy link

Copilot AI Feb 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This plugin adds a top-level README.md, but other plugins typically provide end-user help in docs/README.md (and metadata links point there). Consider moving this content into docs/README.md; also avoid starting with an "Overview" heading per repo doc guidance for embedded help.

Suggested change
## Overview
Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries.
# Before you start
Refer to `docs/README.md` in this plugin folder for full setup and usage instructions for the OpenSearch plugin.

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings February 12, 2026 01:35
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 7 comments.

@@ -0,0 +1,32 @@
if (data.aggregations && data.aggregations.length > 0) {
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

data.aggregations in OpenSearch responses is an object, not an array, so data.aggregations.length > 0 will always be false and aggregation results will never be returned. Use Object.keys(data.aggregations).length (or similar) to detect/handle aggregations before selecting the last aggregation.

Suggested change
if (data.aggregations && data.aggregations.length > 0) {
if (data.aggregations && Object.keys(data.aggregations).length > 0) {

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +3
# Configuration

## Instance URL
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs are provided as docs/setup.md, but the repo convention (and in-product rendering) is docs/README.md. Also, the top heading here is # Configuration, whereas other plugins start with task-focused headings like # Before you start (e.g. plugins/UniFi/v1/docs/README.md:1). Please rename to docs/README.md and align the heading structure so setup guidance is what users see in SquaredUp.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +6
## Overview

Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries.

See the [OpenSearch API docs](https://docs.opensearch.org/latest/api-reference/search-apis/search/) for more information.

Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is named README.md under the plugin version folder, but other plugins keep end-user setup docs under docs/README.md and don’t include a top-level README.md. Additionally, the PR description/checklist says the README includes configuration guidance, but this file is only an overview. Consider moving/merging this content into docs/README.md so users can find both overview + configuration in one place.

Copilot uses AI. Check for mistakes.
Comment on lines +33 to +37
"links": [
{
"category": "documentation",
"url": "https://github.com/squaredup/plugins/blob/main/plugins/OpenSearch/v1/docs/setup.md",
"label": "Help adding this plugin"
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation link points to docs/setup.md, but other plugins consistently link category: documentation to docs/README.md (e.g. plugins/UniFi/v1/metadata.json:31-35). SquaredUp also only renders docs/README.md in-product, so this should be renamed/moved to docs/README.md and the URL updated accordingly.

Copilot uses AI. Check for mistakes.
{
"name": "open-search",
"displayName": "OpenSearch",
"version": "1.0.3",
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding an explicit CODEOWNERS entry for this new plugin so future changes request review from the plugin author (see .github/CODEOWNERS, which lists each existing plugin).

Suggested change
"version": "1.0.3",
"version": "1.0.4",

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings February 13, 2026 18:30
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 9 comments.

"name": "instanceUrl",
"label": "Instance URL",
"validation": { "required": true },
"placeholder": "Enter the OpenSearch URL"
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, ui.json placeholders should use example values where a value follows a fixed pattern. For a URL field, consider providing a more specific example placeholder that shows the expected format, such as "https://your-opensearch-host:9200" instead of the generic instruction "Enter the OpenSearch URL".

Copilot generated this review using guidance from repository custom instructions.
Comment on lines +27 to +28
result = data.hits.hits.map(hit => hit._source);

Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The script assumes that when there are no aggregations, data.hits.hits will always exist and have a _source property. However, if the OpenSearch query fails or returns an unexpected structure, this could cause a runtime error. Consider adding defensive checks to handle cases where data.hits or data.hits.hits might be undefined, or where individual hits might not have a _source property.

Suggested change
result = data.hits.hits.map(hit => hit._source);
const hits = data && data.hits && Array.isArray(data.hits.hits) ? data.hits.hits : [];
result = hits
.filter(hit => hit && Object.prototype.hasOwnProperty.call(hit, '_source'))
.map(hit => hit._source);

Copilot uses AI. Check for mistakes.
Comment on lines +9 to +29
{
"name": "authMode",
"type": "radio",
"label": "Authentication",
"help": "**Basic:** Authenticate with username and password. \n**Anonymous access:** No authentication required",
"defaultValue": "basic",
"validation": {
"required": true
},
"options": [
{
"label": "Basic",
"value": "basic"
},
{
"label": "Anonymous access",
"value": "none"
}

]
},
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, API tokens or OAuth are preferred over username/password authentication where possible. OpenSearch supports API key authentication as an alternative to basic authentication. Consider adding support for API key authentication to provide a more secure authentication option. If basic authentication is the only viable option for your use case, this is acceptable, but API keys would be preferred.

Copilot generated this review using guidance from repository custom instructions.
Comment on lines +5 to +8
"author": {
"name": "SquaredUp Labs",
"type": "labs"
},
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, for community-authored plugins, the author type should be set to "community" and the name should typically be a GitHub username prefixed with @ (e.g., "@username") or an organization name. The PR description indicates this is a community contribution, but the metadata shows "SquaredUp Labs" with type "labs". Please update to reflect the actual community author, for example:

"author": {
    "name": "@yourusername",
    "type": "community"
}

Copilot generated this review using guidance from repository custom instructions.
Comment on lines +2 to +3
"name": "search",
"displayName": "Search",
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, dataStreams should have a description field that is typically one sentence only with no full stop at the end. Consider adding a description to this data stream, such as "Query OpenSearch indices using DSL syntax" to help users understand what this data stream does.

Copilot generated this review using guidance from repository custom instructions.
"name": "SquaredUp Labs",
"type": "labs"
},
"description": "Query OpenSearch databases using DSL.",
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, the description should focus on what users can build or monitor, avoiding API or implementation language. The current description "Query OpenSearch databases using DSL" is quite technical. Consider rephrasing to something more user-focused, such as "Monitor and analyze data from OpenSearch databases." to better describe what users can achieve with this plugin.

Copilot generated this review using guidance from repository custom instructions.
"size": 100
},
"label": "Query body",
"help": "The Query DSL JSON. See [OpenSearch API docs](https://docs.opensearch.org/latest/api-reference/search-apis/search/#request-body).",
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, help text should "Start with a verb where possible". The current help text "The Query DSL JSON. See [OpenSearch API docs]..." starts with "The" rather than a verb. Consider rephrasing to start with a verb, such as "Specify the Query DSL JSON. See [OpenSearch API docs]..." or "Enter the Query DSL JSON. See [OpenSearch API docs]..." to follow the guideline more closely.

Copilot generated this review using guidance from repository custom instructions.
"name": "authMode",
"type": "radio",
"label": "Authentication",
"help": "**Basic:** Authenticate with username and password. \n**Anonymous access:** No authentication required",
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, help text should "Start with a verb where possible". The current help text describes the authentication modes but doesn't start with a verb. Consider rephrasing to start with a verb, such as "Choose Basic to authenticate with username and password, or Anonymous access when no authentication is required." However, given the multi-option format with markdown bold formatting, the current structure may be acceptable for clarity.

Copilot generated this review using guidance from repository custom instructions.
{
"type": "text",
"name": "instanceUrl",
"label": "Instance URL",
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the custom guidelines, for ui.json fields, labels should follow the pattern "First word uppercase, then lowercase" (e.g., "Table name" or "API key"). The current label "Instance URL" has both words capitalized. Consider changing it to "Instance url" to align with the guidelines, though "URL" is commonly capitalized as an acronym. If keeping "URL" capitalized, this should be consistent with other similar fields in the codebase.

Copilot generated this review using guidance from repository custom instructions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant