Skip to content

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 1 to 10
## Instance URL

The base URL of your OpenSearch database.

For example:
`https://<your-opensearch-host>:9200`

Do *not* include the `/api' path.

## Authentication
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 repository expects plugin documentation to live at docs/README.md (that’s what metadata links typically point to and what gets embedded). Consider moving/renaming this content to plugins/OpenSearch/v1/docs/README.md and start headings at level 1 (# …).

Suggested change
## Instance URL
The base URL of your OpenSearch database.
For example:
`https://<your-opensearch-host>:9200`
Do *not* include the `/api' path.
## Authentication
# Instance URL
The base URL of your OpenSearch database.
For example:
`https://<your-opensearch-host>:9200`
Do *not* include the `/api` path.
# Authentication

Copilot uses AI. Check for mistakes.
"pagingConfig_mode": "none",
"pagingConfig_offset_base": 1,
"expandInnerObjects": true,
"endpointPath": "_cat/indices",
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.

OpenSearch _cat/indices returns plain text by default, which will likely fail JSON parsing for httpRequestUnscoped. Request JSON explicitly (e.g. add ?format=json or an Accept: application/json header) so the autocomplete data source works reliably.

Suggested change
"endpointPath": "_cat/indices",
"endpointPath": "_cat/indices?format=json",

Copilot uses AI. Check for mistakes.
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 1 to 27
if (data.aggregations) {

const agg = data.aggregations[Object.keys(data.aggregations).at(-1)]; // last aggregation to support pipelining

if(agg.buckets) {

result = agg.buckets;

} else if (agg.values) {

result = [agg.values];

} else if (agg.value) {

result = [{
value: agg.value
}];

} else {

result = [agg];

}

} else {

result = data.hits.hits.map(hit => hit._source);
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.

Object.keys(data.aggregations).at(-1) will return undefined when aggregations is an empty object, making agg undefined and causing runtime errors when accessing agg.buckets/etc. Add a guard for empty aggregations (and fall back to hits or an empty result) before dereferencing.

Suggested change
if (data.aggregations) {
const agg = data.aggregations[Object.keys(data.aggregations).at(-1)]; // last aggregation to support pipelining
if(agg.buckets) {
result = agg.buckets;
} else if (agg.values) {
result = [agg.values];
} else if (agg.value) {
result = [{
value: agg.value
}];
} else {
result = [agg];
}
} else {
result = data.hits.hits.map(hit => hit._source);
if (data.aggregations && Object.keys(data.aggregations).length > 0) {
const lastAggKey = Object.keys(data.aggregations).at(-1); // last aggregation to support pipelining
const agg = data.aggregations[lastAggKey];
if (agg && agg.buckets) {
result = agg.buckets;
} else if (agg && agg.values) {
result = [agg.values];
} else if (agg && agg.value) {
result = [{
value: agg.value
}];
} else if (agg) {
result = [agg];
} else {
// No valid aggregation object; fall back to hits or empty result
result = (data.hits && data.hits.hits)
? data.hits.hits.map(hit => hit._source)
: [];
}
} else {
result = (data.hits && data.hits.hits)
? data.hits.hits.map(hit => hit._source)
: [];

Copilot uses AI. Check for mistakes.
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.

Comment on lines +10 to +13
"endpointPath": "_cat/indices",
"pathToData": "",
"getArgs": [],
"headers": []
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.

_cat/indices returns plain text by default, which will break JSON parsing / autocomplete. Add ?format=json (and optionally limit columns, e.g. h=index) or set an Accept: application/json header so this data stream reliably returns JSON objects with an index field.

Suggested change
"endpointPath": "_cat/indices",
"pathToData": "",
"getArgs": [],
"headers": []
"endpointPath": "_cat/indices?format=json&h=index",
"pathToData": "",
"getArgs": [],
"headers": [
{
"name": "Accept",
"value": "application/json"
}
]

Copilot uses AI. Check for mistakes.
"postRequestScript": "search.js",
"getArgs": [],
"headers": [],
"postBody": "{{query}}"
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.

postBody is configured as a string template ("{{query}}"). In this repo, postBody is typically a JSON object (see e.g. plugins/SumoLogic/v1/dataStreams/metricsQuery.json:16+), and using a string here risks sending the query as a quoted JSON string rather than a JSON body. Adjust the config so the request body is sent as JSON (not a stringified blob).

Suggested change
"postBody": "{{query}}"
"postBody": {
"query": "{{query}}"
}

Copilot uses AI. Check for mistakes.
@@ -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.
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