Compare commits

..

77 Commits

Author SHA1 Message Date
Wesley van Tilburg
3d70908285 referit changes
Some checks failed
Close stale issues and PRs / stale (push) Has been cancelled
Create Plugin Update / release (push) Has been cancelled
2026-01-29 12:12:20 +00:00
Wesley van Tilburg
57bfef6a23 Fix queryType parsing to handle string values
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:31 +00:00
Wesley van Tilburg
2711048e24 Fix empty filters to match all items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:31 +00:00
Wesley van Tilburg
9b38ec17d5 Add Problems (Alerting) query type to UI
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:31 +00:00
Wesley van Tilburg
7ee9487be1 Release 6.2.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:29 +00:00
Wesley van Tilburg
744124ac6b Add frontend support for MODE_PROBLEMS_ALERTING
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Wesley van Tilburg
2242654303 Wire up MODE_PROBLEMS_ALERTING in query routing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Wesley van Tilburg
f91ee858df Add problems alerting query handler
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Wesley van Tilburg
c6a97c65e6 Add GetTriggers and GetProblems API methods
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Wesley van Tilburg
4c29637fde Add Trigger and Problem structs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Wesley van Tilburg
f8ac3d7025 Add MODE_PROBLEMS_ALERTING constant
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 09:36:08 +00:00
Jocelyn Collado-Kuri
7e279289ec Release 6.1.1 (#2201)
Bug fixes for 6.1.0

---------

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
2026-01-29 09:36:04 +00:00
Wesley van Tilburg
b86330a88d datasource: add testing error to make sure its the right place 2026-01-29 09:35:37 +00:00
Wesley van Tilburg
0806f3625c fix built for newer versions 2026-01-29 09:35:33 +00:00
Jocelyn Collado-Kuri
4ebefec030 release version 6.1.2 (#2259)
release version 6.1.2
2026-01-27 10:27:51 +01:00
Zoltán Bedi
3edec69265 chore: Add back debug backend (#2244) 2026-01-26 17:04:45 +01:00
Zoltán Bedi
88ec24c94c Chore: Disable React 19 e2e tests until we fix them (#2257) 2026-01-26 08:01:10 -08:00
Copilot
984f065296 Fix column visibility toggles not working in problem panel (#2228)
## Fix column visibility in problem panel

- [x] Understand the issue: Column IDs in
`initialState.columnVisibility` don't match actual column accessor IDs
- [x] Fix the column ID mapping in Problems.tsx
- [x] Add tests to verify column visibility works correctly
- [x] Fix reactivity issue: Moved columnVisibility from initialState to
state with useMemo
- [x] Add datasource column definition and visibility mapping
- [x] Optimize datasource cell rendering
- [x] Suppress React Compiler warning for useReactTable
- [x] All tests passing (9/9)
- [x] Build successful
- [x] Lint warnings reduced from 65 to 64

## Summary

Fixed three issues with column visibility in the problem panel:

1. **Incorrect column ID mappings**: Fixed three column IDs to match
actual column accessor IDs.
2. **Non-reactive column visibility**: Moved `columnVisibility` from
`initialState` to `state` with `useMemo`.
3. **Missing datasource column**: Added datasource column definition and
visibility mapping.
4. **Lint warning**: Suppressed React Compiler warning for
`useReactTable` hook (known TanStack Table issue).

All column visibility controls now correctly show/hide their respective
columns without requiring a page refresh.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>Change column in problem panel not working on
6.1.1</issue_title>
> <issue_description>**Describe the bug**
> Since the upgrade from plugin 6.0.3 to 6.1.1, i notice that status
column appears (it was not the case before the upgrade) on existing
problem panels.
> I tried to disable it, and the button was on disable state. The
configuration is great, but not the display. Then i tried to disable or
enable all the colums and it doesn't work too.
> I tried on a new dashboard with a new problem panel and it is the same
issue.
> Font size doesn't work too. All other options seems to work.
> Grafana server has been restarted.
> 
> **Expected behavior**
> Enable or disable the column should change the display of the problem
panel.
> 
> **Screenshots**
> <img width="1916" height="833" alt="Image"
src="https://github.com/user-attachments/assets/1e725aff-fd2d-41cd-bd2b-855ac8c611d0"
/>
> 
> **Network data**
> If it's related to metric data visualization would be great to get the
raw query and response for the network request (check this in browser
dev tools network tab, there you can see metric requests, please include
the request body and request response)
> 
> **Software versions**
> 
> | Grafana | Zabbix | Grafana-Zabbix Plugin |
> | ------- | ------ | --------------------- |
> | 12.3.0   | 7.2.15  | 6.1.1                 |
> </issue_description>
> 
> <agent_instructions>Looks like the regression was introduced via
https://github.com/grafana/grafana-zabbix/pull/2131/changes#diff-85e7fa6e5295bf97f8bf82eabcb5807d695248b9fcd325acd58a8af02824cb70L207</agent_instructions>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> <comment_new><author>@yesoreyeram</author><body>
> I can reproduce this issue. Adding to the backlog for further
investigation.</body></comment_new>
> </comments>
> 


</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes grafana/grafana-zabbix#2213

<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/grafana/grafana-zabbix/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: yesoreyeram <153843+yesoreyeram@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
Co-authored-by: jcolladokuri <20448042+jcolladokuri@users.noreply.github.com>
2026-01-26 15:58:40 +00:00
renovate-sh-app[bot]
0e5577e088 chore(deps): update grafana/plugin-ci-workflows/ci-cd-workflows action to v6.1.0 (#2246)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[grafana/plugin-ci-workflows](https://redirect.github.com/grafana/plugin-ci-workflows)
| action | major | `ci-cd-workflows/v5.1.0` → `ci-cd-workflows/v6.1.0` |

---

### Release Notes

<details>
<summary>grafana/plugin-ci-workflows
(grafana/plugin-ci-workflows)</summary>

###
[`vci-cd-workflows/v6.1.0`](https://redirect.github.com/grafana/plugin-ci-workflows/releases/tag/ci-cd-workflows/v6.1.0):
ci-cd-workflows: v6.1.0

[Compare
Source](https://redirect.github.com/grafana/plugin-ci-workflows/compare/ci-cd-workflows/v6.0.0...ci-cd-workflows/v6.1.0)

##### 🎉 Features

- **cd:** export ci outputs in cd job
([#&#8203;518](https://redirect.github.com/grafana/plugin-ci-workflows/issues/518))
([ce2d1bb](ce2d1bb873))

###
[`vci-cd-workflows/v6.0.0`](https://redirect.github.com/grafana/plugin-ci-workflows/releases/tag/ci-cd-workflows/v6.0.0):
ci-cd-workflows: v6.0.0

[Compare
Source](https://redirect.github.com/grafana/plugin-ci-workflows/compare/ci-cd-workflows/v5.1.0...ci-cd-workflows/v6.0.0)

##### ⚠ BREAKING CHANGES

- **playwright:** remove version and image arguments
([#&#8203;507](https://redirect.github.com/grafana/plugin-ci-workflows/issues/507))

`GRAFANA_VERSION` and `GRAFANA_IMAGE` aren't being passed to Playwright
anymore.

For consumers of the shared workflows that wants to detect Grafana
version within plugin-e2e tests, there's an alternative approach using
the [official
API](https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/):

```ts
test('should be possible to enable advanced mode', async ({ grafanaVersion, alertRuleEditPage }) => {
   test.skip(semver.lt(grafanaVersion, '11.6.0'), 'Advanced mode is not supported in Grafana versions < 11.6.0');
   // test code
});
```

***

- **cd:** allow releasing to prod from non-main branches
([#&#8203;378](https://redirect.github.com/grafana/plugin-ci-workflows/issues/378))

Calls to `cd.yml` must be adjusted to include an additional permission:
`pull-requests: read`, otherwise the workflow will fail with the
following error:

```
Invalid workflow file: ...
The workflow is not valid. .github/workflows/publish.yaml (...): Error calling workflow 'grafana/plugin-ci-workflows/.github/workflows/cd.yml@.... The workflow is requesting 'pull-requests: read', but is only allowed 'pull-requests: none'.
```

Example on the required changes to `cd.yml`:

```diff
jobs:
  cd:
    name: CD
    uses: grafana/plugin-ci-workflows/.github/workflows/cd.yml@main
    permissions:
      contents: write
+     pull-requests: read
      id-token: write
      attestations: write
```

***

##### 🎉 Features

- **cd:** allow releasing to prod from non-main branches
([#&#8203;378](https://redirect.github.com/grafana/plugin-ci-workflows/issues/378))
([e1cf5f6](e1cf5f6083))
- **ci:** add warning when ci and cd workflows are not on the same
reference
([#&#8203;492](https://redirect.github.com/grafana/plugin-ci-workflows/issues/492))
([4e9ca04](4e9ca04ed0))
- **ci:** support react image in e2e matrix
([#&#8203;496](https://redirect.github.com/grafana/plugin-ci-workflows/issues/496))
([6d8cb8c](6d8cb8c524))
- **playwright:** remove version and image arguments
([#&#8203;507](https://redirect.github.com/grafana/plugin-ci-workflows/issues/507))
([f70e822](f70e822660))

#####  Tests

- **act:** add gcom mock, cd.yml changes for testing
([#&#8203;501](https://redirect.github.com/grafana/plugin-ci-workflows/issues/501))
([e3f1779](e3f1779be6))
- **act:** fix validator tests
([#&#8203;506](https://redirect.github.com/grafana/plugin-ci-workflows/issues/506))
([3c93dda](3c93dda78d))

##### 🔧 Chores

- **ci:** run golangci-lint on internal go packages
([#&#8203;485](https://redirect.github.com/grafana/plugin-ci-workflows/issues/485))
([303148f](303148fcc6))
- **deps:** update actions/attest-build-provenance action to v3.1.0
([#&#8203;484](https://redirect.github.com/grafana/plugin-ci-workflows/issues/484))
([ba9c56e](ba9c56e299))
- **deps:** update actions/cache action to v5
([#&#8203;481](https://redirect.github.com/grafana/plugin-ci-workflows/issues/481))
([3eaee5a](3eaee5a68d))
- **deps:** update stefanzweifel/git-auto-commit-action action to v7.1.0
([#&#8203;483](https://redirect.github.com/grafana/plugin-ci-workflows/issues/483))
([f9a22aa](f9a22aa894))
- **deps:** update step-security/harden-runner action to v2.14.0
([#&#8203;477](https://redirect.github.com/grafana/plugin-ci-workflows/issues/477))
([cdab179](cdab179fe0))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicGx1Z2luLWNpLXdvcmtmbG93cyJdfQ==-->

---------

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
2026-01-26 11:27:00 +00:00
renovate-sh-app[bot]
db587e709b chore(deps): update dependency sass to v1.97.3 (#2253)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [sass](https://redirect.github.com/sass/dart-sass) | [`1.97.2` →
`1.97.3`](https://renovatebot.com/diffs/npm/sass/1.97.2/1.97.3) |
![age](https://developer.mend.io/api/mc/badges/age/npm/sass/1.97.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/sass/1.97.2/1.97.3?slim=true)
|

---

### Release Notes

<details>
<summary>sass/dart-sass (sass)</summary>

###
[`v1.97.3`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#1973)

[Compare
Source](https://redirect.github.com/sass/dart-sass/compare/1.97.2...1.97.3)

- Fix a bug where nesting an at-rule within multiple style rules in
plain CSS
  could cause outer style rules to be omitted.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 10:36:12 +01:00
renovate-sh-app[bot]
ea955c5ffa chore(deps): update dependency @types/node to v25.0.10 (#2252)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.0.9` →
`25.0.10`](https://renovatebot.com/diffs/npm/@types%2fnode/25.0.9/25.0.10)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.0.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.0.9/25.0.10?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 10:07:27 +01:00
renovate-sh-app[bot]
97e158c582 chore(deps): update dependency prettier to v3.8.1 (#2251)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://redirect.github.com/prettier/prettier)) | [`3.8.0` →
`3.8.1`](https://renovatebot.com/diffs/npm/prettier/3.8.0/3.8.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.8.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.8.0/3.8.1?slim=true)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.8.1`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#381)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.8.0...3.8.1)


[diff](https://redirect.github.com/prettier/prettier/compare/3.8.0...3.8.1)

##### Include available `printers` in plugin type declarations
([#&#8203;18706](https://redirect.github.com/prettier/prettier/pull/18706)
by [@&#8203;porada](https://redirect.github.com/porada))

<!-- prettier-ignore -->

```ts
// Input
import * as prettierPluginEstree from "prettier/plugins/estree";

// Prettier 3.8.0
// Property 'printers' does not exist on type 'typeof import("prettier/plugins/estree")'. ts(2339)
prettierPluginEstree.printers.estree; //=> any

// Prettier 3.8.1
prettierPluginEstree.printers.estree; //=> Printer
prettierPluginEstree.printers["estree-json"]; //=> Printer
```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 10:06:57 +01:00
renovate-sh-app[bot]
fdef858e9c chore(deps): update dependency eslint-plugin-jsdoc to v62.3.1 (#2249)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`62.2.0` →
`62.3.1`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/62.2.0/62.3.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/62.3.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/62.2.0/62.3.1?slim=true)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v62.3.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.3.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v62.3.0...v62.3.1)

##### Bug Fixes

- update comment-parser, devDeps
([#&#8203;1637](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1637))
([f443986](f44398601f))

###
[`v62.3.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.3.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v62.2.0...v62.3.0)

##### Features

- **`type-formatting`:** add `objectTypeBracketSpacing` option; fixes
[#&#8203;1615](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1615)
([#&#8203;1632](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1632))
([78b6980](78b69804f7))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 10:06:13 +01:00
renovate-sh-app[bot]
fb1bb19834 chore(deps): update dependency @grafana/plugin-e2e to v3.1.4 (#2250)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@grafana/plugin-e2e](https://redirect.github.com/grafana/plugin-tools)
([source](https://redirect.github.com/grafana/plugin-tools/tree/HEAD/packages/plugin-e2e))
| [`3.1.3` →
`3.1.4`](https://renovatebot.com/diffs/npm/@grafana%2fplugin-e2e/3.1.3/3.1.4)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@grafana%2fplugin-e2e/3.1.4?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@grafana%2fplugin-e2e/3.1.3/3.1.4?slim=true)
|

---

### Release Notes

<details>
<summary>grafana/plugin-tools (@&#8203;grafana/plugin-e2e)</summary>

###
[`v3.1.4`](https://redirect.github.com/grafana/plugin-tools/blob/HEAD/packages/plugin-e2e/CHANGELOG.md#v314-Wed-Jan-21-2026)

[Compare
Source](https://redirect.github.com/grafana/plugin-tools/compare/@grafana/plugin-e2e@3.1.3...@grafana/plugin-e2e@3.1.4)

##### 🐛 Bug Fix

- Plugin E2E: Bump
[@&#8203;grafana/e2e-selectors](https://redirect.github.com/grafana/e2e-selectors)
to 12.4.0-21205677807
[#&#8203;2410](https://redirect.github.com/grafana/plugin-tools/pull/2410)
([@&#8203;grafana-plugins-platform-bot\[bot\]](https://redirect.github.com/grafana-plugins-platform-bot\[bot]))

##### Authors: 1

-
[@&#8203;grafana-plugins-platform-bot\[bot\]](https://redirect.github.com/grafana-plugins-platform-bot\[bot])

***

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 09:55:05 +01:00
renovate-sh-app[bot]
d76ffd9cbb fix(deps): update module github.com/grafana/grafana-plugin-sdk-go to v0.286.0 (#2254)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[github.com/grafana/grafana-plugin-sdk-go](https://redirect.github.com/grafana/grafana-plugin-sdk-go)
| `v0.285.0` → `v0.286.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgrafana%2fgrafana-plugin-sdk-go/v0.286.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgrafana%2fgrafana-plugin-sdk-go/v0.285.0/v0.286.0?slim=true)
|

---

### Release Notes

<details>
<summary>grafana/grafana-plugin-sdk-go
(github.com/grafana/grafana-plugin-sdk-go)</summary>

###
[`v0.286.0`](https://redirect.github.com/grafana/grafana-plugin-sdk-go/releases/tag/v0.286.0)

[Compare
Source](https://redirect.github.com/grafana/grafana-plugin-sdk-go/compare/v0.285.0...v0.286.0)

#### What's Changed

- DataFrame: Enable setting vector length to zero by
[@&#8203;ryantxu](https://redirect.github.com/ryantxu) in
[#&#8203;1461](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1461)
- feat: Add chunking query support for datasource plugins by
[@&#8203;dgiagio](https://redirect.github.com/dgiagio) in
[#&#8203;1449](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1449)
- string type for sql query format by
[@&#8203;yesoreyeram](https://redirect.github.com/yesoreyeram) in
[#&#8203;1462](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1462)
- fix(sqlutil): fix FrameFromRows rowLimit handling across result sets
and repeated calls by
[@&#8203;dgiagio](https://redirect.github.com/dgiagio) in
[#&#8203;1463](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1463)
- Fix race condition panic in HARLogger by
[@&#8203;Multimo](https://redirect.github.com/Multimo) in
[#&#8203;1464](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1464)

#### New Contributors

- [@&#8203;Multimo](https://redirect.github.com/Multimo) made their
first contribution in
[#&#8203;1464](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1464)

**Full Changelog**:
<https://github.com/grafana/grafana-plugin-sdk-go/compare/v0.285.0...v0.286.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-26 09:51:49 +01:00
Zoltán Bedi
05ab443cef fix(zabbix): prevent silent removal of itemTagFilter when no tags match regex (#2248)
Added a test to ensure that when a regex itemTagFilter does not match
any tags, the GetItems function returns an empty list instead of all
items. This addresses a bug where an empty tag filter would lead to
unintended behavior by removing the filter silently.

Fixes #2247
2026-01-26 09:50:49 +01:00
renovate-sh-app[bot]
7a2e6185ff chore(deps): update dependency @grafana/plugin-e2e to v3.1.3 (#2245)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@grafana/plugin-e2e](https://redirect.github.com/grafana/plugin-tools)
([source](https://redirect.github.com/grafana/plugin-tools/tree/HEAD/packages/plugin-e2e))
| [`3.1.2` →
`3.1.3`](https://renovatebot.com/diffs/npm/@grafana%2fplugin-e2e/3.1.2/3.1.3)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@grafana%2fplugin-e2e/3.1.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@grafana%2fplugin-e2e/3.1.2/3.1.3?slim=true)
|

---

### Release Notes

<details>
<summary>grafana/plugin-tools (@&#8203;grafana/plugin-e2e)</summary>

###
[`v3.1.3`](https://redirect.github.com/grafana/plugin-tools/blob/HEAD/packages/plugin-e2e/CHANGELOG.md#v313-Tue-Jan-20-2026)

[Compare
Source](https://redirect.github.com/grafana/plugin-tools/compare/@grafana/plugin-e2e@3.1.2...@grafana/plugin-e2e@3.1.3)

🎉 This release contains work from a new contributor! 🎉

Thank you, Paul Marbach
([@&#8203;fastfrwrd](https://redirect.github.com/fastfrwrd)), for all
your work!

##### 🐛 Bug Fix

- Suggestions: Add All Visualizations click for 12.4 and greater
[#&#8203;2399](https://redirect.github.com/grafana/plugin-tools/pull/2399)
([@&#8203;fastfrwrd](https://redirect.github.com/fastfrwrd)
[@&#8203;hugohaggmark](https://redirect.github.com/hugohaggmark)
[@&#8203;sunker](https://redirect.github.com/sunker))

##### Authors: 3

- Erik Sundell ([@&#8203;sunker](https://redirect.github.com/sunker))
- Hugo Häggmark
([@&#8203;hugohaggmark](https://redirect.github.com/hugohaggmark))
- Paul Marbach
([@&#8203;fastfrwrd](https://redirect.github.com/fastfrwrd))

***

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-23 08:52:46 -08:00
renovate-sh-app[bot]
dc1af6dbfb fix(deps): update module github.com/grafana/grafana-plugin-sdk-go to v0.285.0 (#2225)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[github.com/grafana/grafana-plugin-sdk-go](https://redirect.github.com/grafana/grafana-plugin-sdk-go)
| `v0.284.0` → `v0.285.0` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgrafana%2fgrafana-plugin-sdk-go/v0.285.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgrafana%2fgrafana-plugin-sdk-go/v0.284.0/v0.285.0?slim=true)
|

---

### Release Notes

<details>
<summary>grafana/grafana-plugin-sdk-go
(github.com/grafana/grafana-plugin-sdk-go)</summary>

###
[`v0.285.0`](https://redirect.github.com/grafana/grafana-plugin-sdk-go/releases/tag/v0.285.0)

[Compare
Source](https://redirect.github.com/grafana/grafana-plugin-sdk-go/compare/v0.284.0...v0.285.0)

#### What's Changed

- chore(deps): Update actions/checkout action to v5.0.1 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1439](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1439)
- chore(deps): Update Upstream packages by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1442](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1442)
- chore(deps): Update go-openapi packages by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1440](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1440)
- chore(deps): Update module github.com/prometheus/common to v0.67.3 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1441](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1441)
- chore(deps): Update module github.com/go-openapi/swag/loading to
v0.25.3 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1443](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1443)
- chore(deps): Update module github.com/prometheus/common to v0.67.4 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1444](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1444)
- chore(deps): Update GitHub Actions by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1445](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1445)
- chore(deps): Update module google.golang.org/grpc to v1.77.0 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1446](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1446)
- docs: remove SECURITY.md by
[@&#8203;Proximyst](https://redirect.github.com/Proximyst) in
[#&#8203;1448](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1448)
- chore(deps): Update dependency go to v1.25.5 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1450](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1450)
- chore(deps): Update go-openapi packages by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1451](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1451)
- chore(deps): Update module google.golang.org/protobuf to v1.36.11 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1452](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1452)
- chore(deps): Update golangci/golangci-lint-action action to v9.2.0 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1453](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1453)
- chore(deps): Update module github.com/apache/arrow-go/v18 to v18.5.0
by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1454](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1454)
- chore(deps): Update actions/checkout action to v6 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1458](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1458)
- chore(deps): Update module google.golang.org/grpc to v1.78.0 by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1455](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1455)
- chore(deps): Update Upstream packages by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1457](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1457)
- chore(deps): Update OpenTelemetry packages by
[@&#8203;renovate-sh-app](https://redirect.github.com/renovate-sh-app)\[bot]
in
[#&#8203;1456](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1456)
- Add LiveClientQueueMaxSize by
[@&#8203;itsgareth](https://redirect.github.com/itsgareth) in
[#&#8203;1459](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1459)

#### New Contributors

- [@&#8203;itsgareth](https://redirect.github.com/itsgareth) made their
first contribution in
[#&#8203;1459](https://redirect.github.com/grafana/grafana-plugin-sdk-go/pull/1459)

**Full Changelog**:
<https://github.com/grafana/grafana-plugin-sdk-go/compare/v0.284.0...v0.285.0>

```
 gorelease -base v0.284.0 -version v0.285.0      

# github.com/grafana/grafana-plugin-sdk-go/backend
## compatible changes
LiveClientQueueMaxSize: added

# summary
v0.285.0 is a valid semantic version for this release.
```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-22 18:39:31 -08:00
renovate-sh-app[bot]
4d97988677 chore(deps): update actions/checkout action to v6.0.2 (#2239)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://redirect.github.com/actions/checkout) |
action | patch | `v6.0.1` → `v6.0.2` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

###
[`v6.0.2`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v602)

[Compare
Source](https://redirect.github.com/actions/checkout/compare/v6.0.1...v6.0.2)

- Fix tag handling: preserve annotations and explicit fetch-tags by
[@&#8203;ericsciple](https://redirect.github.com/ericsciple) in
[#&#8203;2356](https://redirect.github.com/actions/checkout/pull/2356)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-22 18:28:36 -08:00
renovate-sh-app[bot]
d9f20da91d chore(deps): update dependency @swc/core to v1.15.10 (#2240)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@swc/core](https://swc.rs)
([source](https://redirect.github.com/swc-project/swc)) | [`1.15.8` →
`1.15.10`](https://renovatebot.com/diffs/npm/@swc%2fcore/1.15.8/1.15.10)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@swc%2fcore/1.15.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@swc%2fcore/1.15.8/1.15.10?slim=true)
|

---

### Release Notes

<details>
<summary>swc-project/swc (@&#8203;swc/core)</summary>

###
[`v1.15.10`](https://redirect.github.com/swc-project/swc/blob/HEAD/CHANGELOG.md#11510---2026-01-19)

[Compare
Source](https://redirect.github.com/swc-project/swc/compare/v1.15.8...v1.15.10)

##### Bug Fixes

- **(ci)** Handle merged PRs separately in milestone manager
([#&#8203;11409](https://redirect.github.com/swc-project/swc/issues/11409))
([3554268](3554268dcb))

- **(es/compat)** Preserve this context in nested arrow functions
([#&#8203;11423](https://redirect.github.com/swc-project/swc/issues/11423))
([f2bdaf2](f2bdaf27d8))

- **(es/es2017)** Replace `this` in arrow functions during
async-to-generator
([#&#8203;11450](https://redirect.github.com/swc-project/swc/issues/11450))
([a993da6](a993da6fb6))

##### Features

- **(bindings/wasm)** Enable ecma\_lints feature to support semantic
error detection
([#&#8203;11414](https://redirect.github.com/swc-project/swc/issues/11414))
([1faa4a5](1faa4a5745))

- **(es/hooks)** Implement VisitMutHook for Either type
([#&#8203;11428](https://redirect.github.com/swc-project/swc/issues/11428))
([395c85e](395c85e921))

- **(es/hooks)** Implement VisitMutHook for Option<H>
([#&#8203;11429](https://redirect.github.com/swc-project/swc/issues/11429))
([0bf1954](0bf195421d))

- **(es/hooks)** Add VisitHook trait for immutable AST visitors
([#&#8203;11437](https://redirect.github.com/swc-project/swc/issues/11437))
([3efb41d](3efb41d97e))

- **(es/minifier)** Improve nested template literal evaluation
([#&#8203;11411](https://redirect.github.com/swc-project/swc/issues/11411))
([147df2f](147df2f023))

- **(es/minifier)** Remove inlined IIFE arg and param
([#&#8203;11436](https://redirect.github.com/swc-project/swc/issues/11436))
([2bc5d40](2bc5d402ad))

- **(es/minifier)** Remove inlined IIFE arg and param
([#&#8203;11446](https://redirect.github.com/swc-project/swc/issues/11446))
([baa1ae3](baa1ae3510))

##### Miscellaneous Tasks

- **(deps)** Update `rkyv`
([#&#8203;11419](https://redirect.github.com/swc-project/swc/issues/11419))
([432197b](432197bdc7))

- **(deps)** Update lru to 0.16.3
([#&#8203;11438](https://redirect.github.com/swc-project/swc/issues/11438))
([67c2d75](67c2d75291))

- **(deps)** Update browserslist-data to v0.1.5
([#&#8203;11454](https://redirect.github.com/swc-project/swc/issues/11454))
([e9f78f0](e9f78f032f))

- **(helpers)** Replace MagicString with ast-grep's built-in edit API
([#&#8203;11410](https://redirect.github.com/swc-project/swc/issues/11410))
([a3f0d33](a3f0d33916))

- **(hstr/wtf8)** Address legacy FIXME comments by switching to derives
([#&#8203;11416](https://redirect.github.com/swc-project/swc/issues/11416))
([f03bfd8](f03bfd8dd1))

##### Performance

- **(es/codegen, es/utils)** Migrate to dragonbox\_ecma for faster
Number::toString
([#&#8203;11412](https://redirect.github.com/swc-project/swc/issues/11412))
([b7978cc](b7978cc9db))

- **(es/react)** Optimize JSX transforms to reduce allocations
([#&#8203;11425](https://redirect.github.com/swc-project/swc/issues/11425))
([2a20cb6](2a20cb6e34))

##### Refactor

- **(es)** Improve TypeScript transform configuration structure
([#&#8203;11434](https://redirect.github.com/swc-project/swc/issues/11434))
([f33a975](f33a975c74))

- **(es/minifier)** Migrate MinifierPass to Pass trait
([#&#8203;11442](https://redirect.github.com/swc-project/swc/issues/11442))
([a41e631](a41e63193c))

- **(es/minifier)** Improve tpl to str
([#&#8203;11415](https://redirect.github.com/swc-project/swc/issues/11415))
([0239523](0239523c38))

- **(es/react)** Port to VisitMutHook
([#&#8203;11418](https://redirect.github.com/swc-project/swc/issues/11418))
([9604d9c](9604d9cc8a))

- **(es/transformer)** Remove OptionalHook wrapper in favor of Option<H>
([#&#8203;11430](https://redirect.github.com/swc-project/swc/issues/11430))
([72da6bd](72da6bdd52))

- **(es/transforms)** Migrate TypeScript transform to Pass trait
([#&#8203;11439](https://redirect.github.com/swc-project/swc/issues/11439))
([dd007c6](dd007c64a6))

##### Testing

- **(es)** Enable benchmark for `swc`
([#&#8203;11420](https://redirect.github.com/swc-project/swc/issues/11420))
([3a50a25](3a50a25927))

- Disable LTO for benchmarks
([#&#8203;11421](https://redirect.github.com/swc-project/swc/issues/11421))
([af3c2d3](af3c2d36d7))

- Use rstest as the test framework
([#&#8203;11417](https://redirect.github.com/swc-project/swc/issues/11417))
([fae258f](fae258f530))

##### Ci

- Collapse preivous `claude[bot]` PR review comments
([affb6a2](affb6a29de))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-22 18:13:24 -08:00
renovate-sh-app[bot]
6607957d80 chore(deps): update typescript-eslint monorepo to v8.53.1 (#2241)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`8.53.0` →
`8.53.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.53.0/8.53.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/8.53.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/8.53.0/8.53.1?slim=true)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`8.53.0` →
`8.53.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.53.0/8.53.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.53.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.53.0/8.53.1?slim=true)
|

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/eslint-plugin)</summary>

###
[`v8.53.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8531-2026-01-19)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.53.0...v8.53.1)

##### 🩹 Fixes

- **utils:** make RuleCreator root defaultOptions optional
([#&#8203;11956](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11956))
- **eslint-plugin:** \[consistent-indexed-object-style] skip fixer if
interface is a default export
([#&#8203;11951](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11951))

##### ❤️ Thank You

- Cameron
- Yukihiro Hasegawa [@&#8203;y-hsgw](https://redirect.github.com/y-hsgw)

You can read about our [versioning
strategy](https://typescript-eslint.io/users/versioning) and
[releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/parser)</summary>

###
[`v8.53.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8531-2026-01-19)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.53.0...v8.53.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://typescript-eslint.io/users/versioning) and
[releases](https://typescript-eslint.io/users/releases) on our website.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-22 18:12:50 -08:00
renovate-sh-app[bot]
96061f4c4e chore(deps): update python:3 docker digest to 17bc9f1 (#2234)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `37cba11` → `17bc9f1` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZG9ja2VyIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-22 11:43:49 -08:00
renovate-sh-app[bot]
55c11e8e3d chore(deps): update dependency @testing-library/react to v16.3.2 (#2237)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@testing-library/react](https://redirect.github.com/testing-library/react-testing-library)
| [`16.3.1` →
`16.3.2`](https://renovatebot.com/diffs/npm/@testing-library%2freact/16.3.1/16.3.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2freact/16.3.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2freact/16.3.1/16.3.2?slim=true)
|

---

### Release Notes

<details>
<summary>testing-library/react-testing-library
(@&#8203;testing-library/react)</summary>

###
[`v16.3.2`](https://redirect.github.com/testing-library/react-testing-library/releases/tag/v16.3.2)

[Compare
Source](https://redirect.github.com/testing-library/react-testing-library/compare/v16.3.1...v16.3.2)

##### Bug Fixes

- Update 'onCaughtError' type inference in 'RenderOptions' to work with
React v19
([#&#8203;1438](https://redirect.github.com/testing-library/react-testing-library/issues/1438))
([f32bd1b](f32bd1b033))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-22 09:56:42 -08:00
renovate-sh-app[bot]
4ba5394fe5 chore(deps): update dependency eslint-plugin-jsdoc to v62.2.0 (#2238)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`62.1.0` →
`62.2.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/62.1.0/62.2.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/62.2.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/62.1.0/62.2.0?slim=true)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v62.2.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.2.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v62.1.0...v62.2.0)

##### Features

- **`no-undefined-types`:** support strict validation for TS namespaces
([#&#8203;1616](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1616))
([ed260c5](ed260c59ee))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-22 09:56:06 -08:00
renovate-sh-app[bot]
e388bd7d08 chore(deps): update dependency lodash to v4.17.23 [security] (#2236)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [lodash](https://lodash.com/)
([source](https://redirect.github.com/lodash/lodash)) | [`4.17.21` →
`4.17.23`](https://renovatebot.com/diffs/npm/lodash/4.17.21/4.17.23) |
![age](https://developer.mend.io/api/mc/badges/age/npm/lodash/4.17.23?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/lodash/4.17.21/4.17.23?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-13465](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg)

### Impact

Lodash versions 4.0.0 through 4.17.22 are vulnerable to prototype
pollution in the `_.unset` and `_.omit` functions. An attacker can pass
crafted paths which cause Lodash to delete methods from global
prototypes.

The issue permits deletion of properties but does not allow overwriting
their original behavior.

### Patches

This issue is patched on 4.17.23.

---

### Lodash has Prototype Pollution Vulnerability in `_.unset` and
`_.omit` functions
[CVE-2025-13465](https://nvd.nist.gov/vuln/detail/CVE-2025-13465) /
[GHSA-xxjr-mmjv-4gpg](https://redirect.github.com/advisories/GHSA-xxjr-mmjv-4gpg)

<details>
<summary>More information</summary>

#### Details
##### Impact

Lodash versions 4.0.0 through 4.17.22 are vulnerable to prototype
pollution in the `_.unset` and `_.omit` functions. An attacker can pass
crafted paths which cause Lodash to delete methods from global
prototypes.

The issue permits deletion of properties but does not allow overwriting
their original behavior.

##### Patches

This issue is patched on 4.17.23.

#### Severity
- CVSS Score: 6.9 / 10 (Medium)
- Vector String:
`CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:L/SC:H/SI:H/SA:H/E:P`

#### References
-
[https://github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg](https://redirect.github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg)
-
[https://nvd.nist.gov/vuln/detail/CVE-2025-13465](https://nvd.nist.gov/vuln/detail/CVE-2025-13465)
-
[edadd45214)
-
[https://github.com/lodash/lodash](https://redirect.github.com/lodash/lodash)

This data is provided by
[OSV](https://osv.dev/vulnerability/GHSA-xxjr-mmjv-4gpg) and the [GitHub
Advisory Database](https://redirect.github.com/github/advisory-database)
([CC-BY
4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
</details>

---

### Release Notes

<details>
<summary>lodash/lodash (lodash)</summary>

###
[`v4.17.23`](https://redirect.github.com/lodash/lodash/compare/4.17.21...4.17.23)

[Compare
Source](https://redirect.github.com/lodash/lodash/compare/4.17.21...4.17.23)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYXV0b21lcmdlLXNlY3VyaXR5LXVwZGF0ZSIsInNldmVyaXR5Ok1FRElVTSJdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-22 10:51:48 +00:00
dependabot[bot]
ff4ddc6ead Chore(deps): Bump tar from 7.5.2 to 7.5.6 (#2232)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.2 to 7.5.6.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="394ece6ad8"><code>394ece6</code></a>
7.5.6</li>
<li><a
href="7d4cc17c76"><code>7d4cc17</code></a>
fix race puting a Link ahead of its target File</li>
<li><a
href="26ab90474e"><code>26ab904</code></a>
7.5.5</li>
<li><a
href="e9a1ddb821"><code>e9a1ddb</code></a>
fix: do not prevent valid linkpaths within archive</li>
<li><a
href="911c886bb1"><code>911c886</code></a>
7.5.4</li>
<li><a
href="3b1abfae65"><code>3b1abfa</code></a>
normalize out unicode ligatures</li>
<li><a
href="a43478c5c5"><code>a43478c</code></a>
remove some unused files</li>
<li><a
href="970c58f6d3"><code>970c58f</code></a>
update deps</li>
<li><a
href="bb21974894"><code>bb21974</code></a>
update changelog</li>
<li><a
href="03138441b2"><code>0313844</code></a>
7.5.3</li>
<li>Additional commits viewable in <a
href="https://github.com/isaacs/node-tar/compare/v7.5.2...v7.5.6">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~isaacs">isaacs</a>, a new releaser for tar
since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tar&package-manager=npm_and_yarn&previous-version=7.5.2&new-version=7.5.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/grafana/grafana-zabbix/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-21 12:25:32 +00:00
renovate-sh-app[bot]
e88b15b32c chore(deps): update typescript-eslint monorepo to v8.53.0 (#2224)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`8.52.0` →
`8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.52.0/8.53.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/8.53.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/8.52.0/8.53.0?slim=true)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`8.52.0` →
`8.53.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.52.0/8.53.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.53.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.52.0/8.53.0?slim=true)
|

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/eslint-plugin)</summary>

###
[`v8.53.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8530-2026-01-12)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.52.0...v8.53.0)

##### 🚀 Features

- **eslint-plugin:** add rule \[strict-void-return]
([#&#8203;9707](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/9707))
- **eslint-plugin:** \[no-unused-vars] add a fixer to remove unused
imports
([#&#8203;11922](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11922))

##### 🩹 Fixes

- **eslint-plugin:** \[no-useless-default-assignment] fix false positive
for parameters corresponding to a rest parameter
([#&#8203;11916](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11916))
- **eslint-plugin:** replace unclear "`error` typed" with more helpful
description
([#&#8203;11704](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11704))
- **typescript-estree:** forbid invalid `extends` and `implements` in
interface declaration
([#&#8203;11935](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11935))
- **typescript-estree:** forbid invalid class implements
([#&#8203;11934](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11934))
- **typescript-estree:** forbid type-only import with both default and
named specifiers
([#&#8203;11930](https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11930))

##### ❤️ Thank You

- Brad Zacher
[@&#8203;bradzacher](https://redirect.github.com/bradzacher)
- fisker Cheung [@&#8203;fisker](https://redirect.github.com/fisker)
- Josh Goldberg
- Josh Goldberg 
- Kirk Waiblinger
- Niki [@&#8203;phaux](https://redirect.github.com/phaux)
- Nikita
- SungHyun627
[@&#8203;SungHyun627](https://redirect.github.com/SungHyun627)
- Will Harney [@&#8203;wjhsf](https://redirect.github.com/wjhsf)

You can read about our [versioning
strategy](https://typescript-eslint.io/users/versioning) and
[releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/parser)</summary>

###
[`v8.53.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8530-2026-01-12)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.52.0...v8.53.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://typescript-eslint.io/users/versioning) and
[releases](https://typescript-eslint.io/users/releases) on our website.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-21 12:24:56 +00:00
renovate-sh-app[bot]
ef773399c6 chore(deps): update dependency eslint-plugin-jsdoc to v62.1.0 (#2231)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`62.0.1` →
`62.1.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/62.0.1/62.1.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/62.1.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/62.0.1/62.1.0?slim=true)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v62.1.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.1.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v62.0.1...v62.1.0)

##### Features

- update comment-parser; fixes
[#&#8203;1116](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1116)
; fixes
[#&#8203;1348](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1348)
([0170773](0170773d9a))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-21 10:03:32 +00:00
renovate-sh-app[bot]
c96155c4a1 chore(deps): update dependency eslint-plugin-jsdoc to v62.0.1 (#2230)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`62.0.0` →
`62.0.1`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/62.0.0/62.0.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/62.0.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/62.0.0/62.0.1?slim=true)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v62.0.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.0.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v62.0.0...v62.0.1)

##### Bug Fixes

- **`require-template`:** treat infer statement types as defined; fixes
[#&#8203;1628](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1628)
([e63dc23](e63dc23feb))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 13:56:14 +00:00
renovate-sh-app[bot]
98af1074cd fix(deps): update module golang.org/x/net to v0.49.0 (#2226)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [golang.org/x/net](https://pkg.go.dev/golang.org/x/net) | [`v0.48.0` →
`v0.49.0`](https://cs.opensource.google/go/x/net/+/refs/tags/v0.48.0...refs/tags/v0.49.0)
|
![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fnet/v0.49.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fnet/v0.48.0/v0.49.0?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 10:43:26 +00:00
renovate-sh-app[bot]
17883d72b4 chore(deps): update zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest docker digest to 927b9a2 (#2215)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-web-nginx-pgsql | digest | `08b2b13` → `927b9a2` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:24:18 +00:00
renovate-sh-app[bot]
64c73445d2 chore(deps): update dependency @babel/core to v7.28.6 (#2216)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@babel/core](https://babel.dev/docs/en/next/babel-core)
([source](https://redirect.github.com/babel/babel/tree/HEAD/packages/babel-core))
| [`7.28.5` →
`7.28.6`](https://renovatebot.com/diffs/npm/@babel%2fcore/7.28.5/7.28.6)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fcore/7.28.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fcore/7.28.5/7.28.6?slim=true)
|

---

### Release Notes

<details>
<summary>babel/babel (@&#8203;babel/core)</summary>

###
[`v7.28.6`](https://redirect.github.com/babel/babel/releases/tag/v7.28.6)

[Compare
Source](https://redirect.github.com/babel/babel/compare/v7.28.5...v7.28.6)

#### v7.28.6 (2026-01-12)

Thanks [@&#8203;kadhirash](https://redirect.github.com/kadhirash) and
[@&#8203;kolvian](https://redirect.github.com/kolvian) for your first
PRs!

##### 🐛 Bug Fix

- `babel-cli`, `babel-code-frame`, `babel-core`,
`babel-helper-check-duplicate-nodes`, `babel-helper-fixtures`,
`babel-helper-plugin-utils`, `babel-node`,
`babel-plugin-transform-flow-comments`,
`babel-plugin-transform-modules-commonjs`,
`babel-plugin-transform-property-mutators`, `babel-preset-env`,
`babel-traverse`, `babel-types`
- [#&#8203;17589](https://redirect.github.com/babel/babel/pull/17589)
Improve Unicode handling in code-frame tokenizer
([@&#8203;JLHwung](https://redirect.github.com/JLHwung))
- `babel-plugin-transform-regenerator`
- [#&#8203;17556](https://redirect.github.com/babel/babel/pull/17556)
fix: `transform-regenerator` correctly handles scope
([@&#8203;liuxingbaoyu](https://redirect.github.com/liuxingbaoyu))
- `babel-plugin-transform-react-jsx`
- [#&#8203;17538](https://redirect.github.com/babel/babel/pull/17538)
fix: Keep jsx comments
([@&#8203;liuxingbaoyu](https://redirect.github.com/liuxingbaoyu))

##### :nail\_care: Polish

- `babel-core`, `babel-standalone`
- [#&#8203;17606](https://redirect.github.com/babel/babel/pull/17606)
Polish(standalone): improve message on invalid preset/plugin
([@&#8203;JLHwung](https://redirect.github.com/JLHwung))

##### 🏠 Internal

- `babel-plugin-bugfix-v8-static-class-fields-redefine-readonly`,
`babel-plugin-proposal-decorators`,
`babel-plugin-proposal-import-attributes-to-assertions`,
`babel-plugin-proposal-import-wasm-source`,
`babel-plugin-syntax-async-do-expressions`,
`babel-plugin-syntax-decorators`,
`babel-plugin-syntax-destructuring-private`,
`babel-plugin-syntax-do-expressions`,
`babel-plugin-syntax-explicit-resource-management`,
`babel-plugin-syntax-export-default-from`, `babel-plugin-syntax-flow`,
`babel-plugin-syntax-function-bind`,
`babel-plugin-syntax-function-sent`,
`babel-plugin-syntax-import-assertions`,
`babel-plugin-syntax-import-attributes`,
`babel-plugin-syntax-import-defer`, `babel-plugin-syntax-import-source`,
`babel-plugin-syntax-jsx`, `babel-plugin-syntax-module-blocks`,
`babel-plugin-syntax-optional-chaining-assign`,
`babel-plugin-syntax-partial-application`,
`babel-plugin-syntax-pipeline-operator`,
`babel-plugin-syntax-throw-expressions`,
`babel-plugin-syntax-typescript`,
`babel-plugin-transform-async-generator-functions`,
`babel-plugin-transform-async-to-generator`,
`babel-plugin-transform-class-properties`,
`babel-plugin-transform-class-static-block`,
`babel-plugin-transform-dotall-regex`,
`babel-plugin-transform-duplicate-named-capturing-groups-regex`,
`babel-plugin-transform-explicit-resource-management`,
`babel-plugin-transform-exponentiation-operator`,
`babel-plugin-transform-json-strings`,
`babel-plugin-transform-logical-assignment-operators`,
`babel-plugin-transform-nullish-coalescing-operator`,
`babel-plugin-transform-numeric-separator`,
`babel-plugin-transform-object-rest-spread`,
`babel-plugin-transform-optional-catch-binding`,
`babel-plugin-transform-optional-chaining`,
`babel-plugin-transform-private-methods`,
`babel-plugin-transform-private-property-in-object`,
`babel-plugin-transform-regexp-modifiers`,
`babel-plugin-transform-unicode-property-regex`,
`babel-plugin-transform-unicode-sets-regex`
- [#&#8203;17580](https://redirect.github.com/babel/babel/pull/17580)
Allow Babel 8 in compatible Babel 7 plugins
([@&#8203;nicolo-ribaudo](https://redirect.github.com/nicolo-ribaudo))

##### :running\_woman: Performance

- `babel-plugin-transform-react-jsx`
- [#&#8203;17555](https://redirect.github.com/babel/babel/pull/17555)
perf: Use lighter traversal for jsx `__source,__self`
([@&#8203;liuxingbaoyu](https://redirect.github.com/liuxingbaoyu))

##### Committers: 7

- Babel Bot ([@&#8203;babel-bot](https://redirect.github.com/babel-bot))
- Eliot Pontarelli
([@&#8203;kolvian](https://redirect.github.com/kolvian))
- Huáng Jùnliàng
([@&#8203;JLHwung](https://redirect.github.com/JLHwung))
- Kadhirash Sivakumar
([@&#8203;kadhirash](https://redirect.github.com/kadhirash))
- Nicolò Ribaudo
([@&#8203;nicolo-ribaudo](https://redirect.github.com/nicolo-ribaudo))
- [@&#8203;liuxingbaoyu](https://redirect.github.com/liuxingbaoyu)
- coderaiser
([@&#8203;coderaiser](https://redirect.github.com/coderaiser))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:23:53 +00:00
renovate-sh-app[bot]
f511ec060e chore(deps): update dependency @grafana/plugin-e2e to v3.1.2 (#2217)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@grafana/plugin-e2e](https://redirect.github.com/grafana/plugin-tools)
([source](https://redirect.github.com/grafana/plugin-tools/tree/HEAD/packages/plugin-e2e))
| [`3.1.1` →
`3.1.2`](https://renovatebot.com/diffs/npm/@grafana%2fplugin-e2e/3.1.1/3.1.2)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@grafana%2fplugin-e2e/3.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@grafana%2fplugin-e2e/3.1.1/3.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>grafana/plugin-tools (@&#8203;grafana/plugin-e2e)</summary>

###
[`v3.1.2`](https://redirect.github.com/grafana/plugin-tools/compare/@grafana/plugin-e2e@3.1.1...@grafana/plugin-e2e@3.1.2)

[Compare
Source](https://redirect.github.com/grafana/plugin-tools/compare/@grafana/plugin-e2e@3.1.1...@grafana/plugin-e2e@3.1.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:23:24 +00:00
renovate-sh-app[bot]
092e1c6014 chore(deps): update dependency eslint-plugin-prettier to v5.5.5 (#2218)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-prettier](https://redirect.github.com/prettier/eslint-plugin-prettier)
| [`5.5.4` →
`5.5.5`](https://renovatebot.com/diffs/npm/eslint-plugin-prettier/5.5.4/5.5.5)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-prettier/5.5.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-prettier/5.5.4/5.5.5?slim=true)
|

---

### Release Notes

<details>
<summary>prettier/eslint-plugin-prettier
(eslint-plugin-prettier)</summary>

###
[`v5.5.5`](https://redirect.github.com/prettier/eslint-plugin-prettier/blob/HEAD/CHANGELOG.md#555)

[Compare
Source](https://redirect.github.com/prettier/eslint-plugin-prettier/compare/v5.5.4...v5.5.5)

##### Patch Changes

-
[#&#8203;772](https://redirect.github.com/prettier/eslint-plugin-prettier/pull/772)
[`7264ed0`](7264ed0a6c)
Thanks [@&#8203;BPScott](https://redirect.github.com/BPScott)! - Bump
prettier-linter-helpers dependency to v1.0.1

-
[#&#8203;776](https://redirect.github.com/prettier/eslint-plugin-prettier/pull/776)
[`77651a3`](77651a33cd)
Thanks [@&#8203;aswils](https://redirect.github.com/aswils)! - fix: bump
synckit for yarn PnP ESM issue

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:22:59 +00:00
renovate-sh-app[bot]
a05b93314d chore(deps): update dependency swc-loader to v0.2.7 (#2219)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [swc-loader](https://redirect.github.com/swc-project/pkgs) | [`0.2.6`
→ `0.2.7`](https://renovatebot.com/diffs/npm/swc-loader/0.2.6/0.2.7) |
![age](https://developer.mend.io/api/mc/badges/age/npm/swc-loader/0.2.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/swc-loader/0.2.6/0.2.7?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:22:34 +00:00
renovate-sh-app[bot]
0a5129cf2c chore(deps): update actions/setup-go action to v6.2.0 (#2220)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-go](https://redirect.github.com/actions/setup-go) |
action | minor | `v6.1.0` → `v6.2.0` |

---

### Release Notes

<details>
<summary>actions/setup-go (actions/setup-go)</summary>

###
[`v6.2.0`](https://redirect.github.com/actions/setup-go/releases/tag/v6.2.0)

[Compare
Source](https://redirect.github.com/actions/setup-go/compare/v6.1.0...v6.2.0)

#### What's Changed

##### Enhancements

- Example for restore-only cache in documentation by
[@&#8203;aparnajyothi-y](https://redirect.github.com/aparnajyothi-y) in
[#&#8203;696](https://redirect.github.com/actions/setup-go/pull/696)
- Update Node.js version in action.yml by
[@&#8203;ccoVeille](https://redirect.github.com/ccoVeille) in
[#&#8203;691](https://redirect.github.com/actions/setup-go/pull/691)
- Documentation update of actions/checkout by
[@&#8203;deining](https://redirect.github.com/deining) in
[#&#8203;683](https://redirect.github.com/actions/setup-go/pull/683)

##### Dependency updates

- Upgrade js-yaml from 3.14.1 to 3.14.2 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[#&#8203;682](https://redirect.github.com/actions/setup-go/pull/682)
- Upgrade
[@&#8203;actions/cache](https://redirect.github.com/actions/cache) to v5
by [@&#8203;salmanmkc](https://redirect.github.com/salmanmkc) in
[#&#8203;695](https://redirect.github.com/actions/setup-go/pull/695)
- Upgrade actions/checkout from 5 to 6 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[#&#8203;686](https://redirect.github.com/actions/setup-go/pull/686)
- Upgrade qs from 6.14.0 to 6.14.1 by
[@&#8203;dependabot](https://redirect.github.com/dependabot) in
[#&#8203;703](https://redirect.github.com/actions/setup-go/pull/703)

#### New Contributors

- [@&#8203;ccoVeille](https://redirect.github.com/ccoVeille) made their
first contribution in
[#&#8203;691](https://redirect.github.com/actions/setup-go/pull/691)
- [@&#8203;deining](https://redirect.github.com/deining) made their
first contribution in
[#&#8203;683](https://redirect.github.com/actions/setup-go/pull/683)

**Full Changelog**:
<https://github.com/actions/setup-go/compare/v6...v6.2.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:22:10 +00:00
renovate-sh-app[bot]
b56f9e7ebb chore(deps): update dependency cspell to v9.6.0 (#2221)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [cspell](https://cspell.org/)
([source](https://redirect.github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell))
| [`9.4.0` →
`9.6.0`](https://renovatebot.com/diffs/npm/cspell/9.4.0/9.6.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/cspell/9.6.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/cspell/9.4.0/9.6.0?slim=true)
|

---

### Release Notes

<details>
<summary>streetsidesoftware/cspell (cspell)</summary>

###
[`v9.6.0`](https://redirect.github.com/streetsidesoftware/cspell/blob/HEAD/packages/cspell/CHANGELOG.md#v960-2026-01-12)

[Compare
Source](https://redirect.github.com/streetsidesoftware/cspell/compare/v9.4.0...v9.6.0)

##### Features

<details>
<summary>feat: ESLint-plugin -- Distinguish between Forbidden,
Misspelled, and Unknown words. (<a
href="https://redirect.github.com/streetsidesoftware/cspell/pull/8337">#&#8203;8337</a>)</summary>

##### feat: ESLint-plugin -- Distinguish between Forbidden, Misspelled,
and Unknown words.
([#&#8203;8337](https://redirect.github.com/streetsidesoftware/cspell/pull/8337))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:21:42 +00:00
renovate-sh-app[bot]
97aeabed61 chore(deps): update dependency mini-css-extract-plugin to v2.10.0 (#2222)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[mini-css-extract-plugin](https://redirect.github.com/webpack/mini-css-extract-plugin)
| [`2.9.4` →
`2.10.0`](https://renovatebot.com/diffs/npm/mini-css-extract-plugin/2.9.4/2.10.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/mini-css-extract-plugin/2.10.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/mini-css-extract-plugin/2.9.4/2.10.0?slim=true)
|

---

### Release Notes

<details>
<summary>webpack/mini-css-extract-plugin
(mini-css-extract-plugin)</summary>

###
[`v2.10.0`](https://redirect.github.com/webpack/mini-css-extract-plugin/blob/HEAD/CHANGELOG.md#2100-2026-01-16)

[Compare
Source](https://redirect.github.com/webpack/mini-css-extract-plugin/compare/v2.9.4...v2.10.0)

##### Features

- respect `output.cssFilename` and `output.cssChunkFilename`
([#&#8203;1151](https://redirect.github.com/webpack/mini-css-extract-plugin/issues/1151))
([54f775d](54f775ddac))

##### Bug Fixes

- prevent generation of a contentHash for a chunk when the set of css
modules is of size 0
([#&#8203;1154](https://redirect.github.com/webpack/mini-css-extract-plugin/issues/1154))
([4e4a95d](4e4a95d164))

#####
[2.9.4](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.9.3...v2.9.4)
(2025-08-11)

##### Bug Fixes

- hmr crash in some situations
([#&#8203;1140](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/issues/1140))
([f67c05a](f67c05a230))

#####
[2.9.3](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.9.2...v2.9.3)
(2025-08-04)

##### Bug Fixes

- should update initial chunks correctly with filename
([dab023f](dab023f4a7))

#####
[2.9.2](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.9.1...v2.9.2)
(2024-11-01)

##### Bug Fixes

- prefetch and preload runtime generation
([#&#8203;1116](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/issues/1116))
([58c6b74](58c6b7422a))

#####
[2.9.1](https://redirect.github.com/webpack-contrib/mini-css-extract-plugin/compare/v2.9.0...v2.9.1)
(2024-08-19)

##### Bug Fixes

- add `export default {}` when CSS modules enabled and a file is empty
for the `defaultExport` option
([8f77e19](8f77e19a89))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:21:21 +00:00
renovate-sh-app[bot]
eecde20d39 chore(deps): update dependency prettier to v3.8.0 (#2223)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://redirect.github.com/prettier/prettier)) | [`3.7.4` →
`3.8.0`](https://renovatebot.com/diffs/npm/prettier/3.7.4/3.8.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.8.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.7.4/3.8.0?slim=true)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.8.0`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#380)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.7.4...3.8.0)


[diff](https://redirect.github.com/prettier/prettier/compare/3.7.4...3.8.0)

🔗 [Release Notes](https://prettier.io/blog/2026/01/14/3.8.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44Mi4zIiwidXBkYXRlZEluVmVyIjoiNDIuODIuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-20 07:20:57 +00:00
renovate-sh-app[bot]
56a06171ec chore(deps): update dependency @types/node to v25.0.9 (#2196)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.0.5` →
`25.0.9`](https://renovatebot.com/diffs/npm/@types%2fnode/25.0.5/25.0.9)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.0.9?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.0.5/25.0.9?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: yesoreyeram <153843+yesoreyeram@users.noreply.github.com>
2026-01-19 23:30:35 +00:00
renovate-sh-app[bot]
92e90c027e chore(deps): update zabbix/zabbix-server-pgsql:alpine-7.0-latest docker digest to 2cec4dd (#2206)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-server-pgsql | digest | `b3c1451` → `2cec4dd` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:23:13 +00:00
renovate-sh-app[bot]
0a1121ed73 chore(deps): update dependency @types/lodash to v4.17.23 (#2195)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/lodash](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash))
| [`4.17.22` →
`4.17.23`](https://renovatebot.com/diffs/npm/@types%2flodash/4.17.22/4.17.23)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2flodash/4.17.23?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2flodash/4.17.22/4.17.23?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:22:50 +00:00
renovate-sh-app[bot]
a26d77f6e3 chore(deps): update postgres:18 docker digest to 5773fe7 (#2190)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| postgres | digest | `bfe50b2` → `5773fe7` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:22:21 +00:00
renovate-sh-app[bot]
f92bea2580 chore(deps): update zabbix/zabbix-agent:alpine-7.0-latest docker digest to 5286501 (#2203)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-agent | digest | `71f1f22` → `5286501` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:21:49 +00:00
renovate-sh-app[bot]
71127842ea chore(deps): update zabbix/zabbix-server-pgsql:alpine-7.4-latest docker digest to 0337912 (#2207)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-server-pgsql | digest | `a6f748d` → `0337912` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:21:26 +00:00
renovate-sh-app[bot]
ffa62a1631 chore(deps): update zabbix/zabbix-web-apache-pgsql:alpine-7.4-latest docker digest to f735795 (#2208)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-web-apache-pgsql | digest | `9b5ad53` → `f735795` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:20:39 +00:00
renovate-sh-app[bot]
b926aa85bc chore(deps): update zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest docker digest to b38d7ae (#2209)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-web-nginx-pgsql | digest | `e034dd9` → `b38d7ae` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:20:15 +00:00
dependabot[bot]
fb80f4cc4c Chore(deps): Bump tar from 7.5.2 to 7.5.3 (#2212)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.2 to 7.5.3.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="03138441b2"><code>0313844</code></a>
7.5.3</li>
<li><a
href="340eb285b6"><code>340eb28</code></a>
fix: sanitize absolute linkpaths properly</li>
<li><a
href="8bb83f7e51"><code>8bb83f7</code></a>
update deps</li>
<li><a
href="1c4aedd28a"><code>1c4aedd</code></a>
Fix typo in onWriteEntry documentation</li>
<li>See full diff in <a
href="https://github.com/isaacs/node-tar/compare/v7.5.2...v7.5.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tar&package-manager=npm_and_yarn&previous-version=7.5.2&new-version=7.5.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/grafana/grafana-zabbix/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-19 23:19:47 +00:00
renovate-sh-app[bot]
baed463010 chore(deps): update python:3 docker digest to 37cba11 (#2191)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `6d58c1a` → `37cba11` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZG9ja2VyIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-19 23:19:25 +00:00
Christos Diamantis
3ada0d15e6 Add the ability to convert specific tags to columns on problems panel (#2113)
This closes #2112

Added the ability on problems panel to specify a comma separated list of
tag names to be converted to columns.
If a tag name is present multiple times, it will return the value of all
tags separated with comma.
For optimum readability, the tag names are Capitalized for the visible
column name.
Also, for optimum readability, the custom tags are always placed before
the "Tags" column.

In case a tag is not there for a problem, an empty string is returned.

---------

Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-15 12:36:36 -08:00
renovate-sh-app[bot]
95554b0b8c chore(deps): update zabbix/zabbix-agent:alpine-6.0-latest docker digest to 4686ff4 (#2202)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-agent | digest | `9eab77e` → `4686ff4` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-15 12:15:06 -08:00
renovate-sh-app[bot]
ec8fe8c1e0 chore(deps): update python:3.13-slim-bookworm docker digest to 97e9392 (#2192)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `0c5171f` → `97e9392` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZG9ja2VyIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
2026-01-15 16:31:49 +00:00
renovate-sh-app[bot]
c4b5f3dd53 chore(deps): update zabbix/zabbix-agent:alpine-7.4-latest docker digest to cfc4506 (#2204)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-agent | digest | `2a5989f` → `cfc4506` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-14 23:12:30 +00:00
renovate-sh-app[bot]
5ffb7cdb6c chore(deps): update zabbix/zabbix-server-pgsql:alpine-6.0-latest docker digest to b343034 (#2205)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| zabbix/zabbix-server-pgsql | digest | `dbc5a2a` → `b343034` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-14 23:12:04 +00:00
Jocelyn Collado-Kuri
5cac1b9b18 Release 6.1.1 (#2201)
Bug fixes for 6.1.0

---------

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
2026-01-14 12:28:26 -08:00
Jocelyn Collado-Kuri
3a4f3280be Fix proxies dropdown in Problems query editor (#2200)
Part 2 of #2197 

Zabbix has two ways of processing and returning proxies depending on the
zabbix version being used:

1. Before 7.0.0 it uses `host`
2. After 7.0.0 it uses `name`


when we made the call to the backend, we accounted for this
[difference](592380851c/src/datasource/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts (L940C5-L944C6)).
However, in the frontend, we always populated the dropdown using
`proxy.host` regardless of the version customers were using.

So for customers that had proxies in their zabbix set up AND were using
a zabbix version `>-7.0.0`, the query editor would crash because we
ended up with a list of undefined options.

This PR changes it so that when `host` is not present, it uses `name` or
otherwise defaults to `''` to ensure that we never have and array of
options with undefined values.
2026-01-14 11:50:17 -08:00
ismail simsek
592380851c Fix moment rendering bug (#2199)
While we are rendering Problems table for each cell we use a different
renderer. For `Age` field we didn't pass the data properly and it caused
errors. The problem is we were trying to render the whole moment object
instead of just the datatime.

Part of: https://github.com/grafana/grafana-zabbix/issues/2197

This PR will fix the issue. This happens when user wants to add a new
panel with `Age` field or try to edit a problems panel `Age` field
enabled.

Kudos to @yesoreyeram
2026-01-14 20:25:48 +01:00
Zoltán Bedi
4e6a75c93d Release 6.1.0 (#2194) 2026-01-13 13:50:49 +01:00
renovate-sh-app[bot]
ffe5c44960 chore(deps): update dependency @types/node to v25.0.5 (#2189)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`25.0.3` →
`25.0.5`](https://renovatebot.com/diffs/npm/@types%2fnode/25.0.3/25.0.5)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.0.5?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.0.3/25.0.5?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-13 12:52:17 +01:00
renovate-sh-app[bot]
c1dec23e3c chore(deps): update dependency @types/lodash to v4.17.22 (#2193)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@types/lodash](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash))
| [`4.17.21` →
`4.17.22`](https://renovatebot.com/diffs/npm/@types%2flodash/4.17.21/4.17.22)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2flodash/4.17.22?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2flodash/4.17.21/4.17.22?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLXBhdGNoIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-13 10:53:08 +01:00
ismail simsek
a2f8b6433a Introduce query timeout configuration (#2157)
## Summary

Implements configurable query execution timeout controls to prevent
poorly optimized or excessive queries from consuming excessive server
resources, causing performance degradation, or crashing the Zabbix
server.

Fixes: https://github.com/grafana/oss-big-tent-squad/issues/127

## Problem

Previously, the plugin only had an HTTP connection timeout (`timeout`)
that controlled individual API request timeouts. However, a complete
query execution could involve multiple API calls and run indefinitely if
not properly controlled, potentially causing resource exhaustion.

## Solution

Added a new `queryTimeout` setting that enforces a maximum execution
time for entire database queries initiated by the plugin. Queries
exceeding this limit are automatically terminated with proper error
handling and logging.

## Testing

1. Configure a datasource with `queryTimeout` set to a low value (e.g.,
5 seconds)
2. Execute a query that would normally take longer than the timeout
3. Verify that:
   - Query is terminated after the timeout period
   - Error message indicates timeout occurred
   - Logs contain timeout warning with query details
   - Other queries in the same request continue to execute

## Notes

- `queryTimeout` is separate from `timeout` (HTTP connection timeout)
- `queryTimeout` applies to the entire query execution, which may
involve multiple API calls
- Default value of 60 seconds ensures reasonable protection while
allowing normal queries to complete
- Timeout errors are logged with query refId, queryType, timeout
duration, and datasourceId for troubleshooting
2026-01-12 15:30:31 +01:00
renovate-sh-app[bot]
7eb80d3f23 chore(deps): update dependency eslint-plugin-jsdoc to v62 (#2188)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`61.5.0` →
`62.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/61.5.0/62.0.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/62.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/61.5.0/62.0.0?slim=true)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v62.0.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v62.0.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v61.7.1...v62.0.0)

##### Features

- update jsdoccomment, allowing for
`skipInvokedExpressionsForCommentFinding` setting; fixes
[#&#8203;1624](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1624)
([9c0e4a3](9c0e4a32c6))

##### BREAKING CHANGES

- Require Node ^20.19.0 || ^22.13.0 || >=24

###
[`v61.7.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v61.7.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v61.5.0...v61.7.1)

##### Bug Fixes

- **`github`:** `npm` release
([#&#8203;1623](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1623))
([fe29ef9](fe29ef98bc))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1ham9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-12 12:59:16 +01:00
renovate-sh-app[bot]
2b5bfd4de6 chore(deps): update grafana/plugin-ci-workflows/ci-cd-workflows action to v5.1.0 (#2186)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[grafana/plugin-ci-workflows](https://redirect.github.com/grafana/plugin-ci-workflows)
| action | minor | `ci-cd-workflows/v5.0.0` → `ci-cd-workflows/v5.1.0` |

---

### Release Notes

<details>
<summary>grafana/plugin-ci-workflows
(grafana/plugin-ci-workflows)</summary>

###
[`vci-cd-workflows/v5.1.0`](https://redirect.github.com/grafana/plugin-ci-workflows/releases/tag/ci-cd-workflows/v5.1.0):
ci-cd-workflows: v5.1.0

[Compare
Source](https://redirect.github.com/grafana/plugin-ci-workflows/compare/ci-cd-workflows/v5.0.0...ci-cd-workflows/v5.1.0)

##### 🎉 Features

- **ci:** setup Go version from go.mod if possible
([#&#8203;465](https://redirect.github.com/grafana/plugin-ci-workflows/issues/465))
([5d5ab0a](5d5ab0a5fd))

##### 🐛 Bug Fixes

- **tests:** fix act checkout in pull\_request events
([#&#8203;463](https://redirect.github.com/grafana/plugin-ci-workflows/issues/463))
([56388a7](56388a7772))

#####  Performance Improvements

- **ci:** cache mage, Trufflehog and golangci-lint binaries
([#&#8203;467](https://redirect.github.com/grafana/plugin-ci-workflows/issues/467))
([b736834](b736834676))

#####  Tests

- **act:** add plugin-validator tests
([#&#8203;457](https://redirect.github.com/grafana/plugin-ci-workflows/issues/457))
([82db8bf](82db8bf61e))

##### 🔧 Chores

- **deps:** update actions/create-github-app-token action to v2.2.1
([#&#8203;475](https://redirect.github.com/grafana/plugin-ci-workflows/issues/475))
([eeaa07a](eeaa07abac))
- **deps:** update actions/setup-node action to v6
([#&#8203;362](https://redirect.github.com/grafana/plugin-ci-workflows/issues/362))
([69022ab](69022ab90e))
- **deps:** update peter-evans/create-pull-request action to v8
([#&#8203;478](https://redirect.github.com/grafana/plugin-ci-workflows/issues/478))
([8f4d6ea](8f4d6ea8d1))
- **main:** release plugins-frontend-e2e-against-stack 1.0.1
([#&#8203;432](https://redirect.github.com/grafana/plugin-ci-workflows/issues/432))
([d3ca365](d3ca3655e3))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicGx1Z2luLWNpLXdvcmtmbG93cyJdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-12 12:32:46 +01:00
renovate-sh-app[bot]
5be89db773 chore(deps): update postgres docker tag to v18 (#2182)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| postgres | major | `16` → `18` |
| postgres | major | `15` → `18` |
| postgres | major | `14` → `18` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1ham9yIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-09 06:51:31 -08:00
renovate-sh-app[bot]
0316e42c8b chore(deps): pin dependencies (#2173)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[@testing-library/dom](https://redirect.github.com/testing-library/dom-testing-library)
| devDependencies | pin | [`^10.4.1` →
`10.4.1`](https://renovatebot.com/diffs/npm/@testing-library%2fdom/10.4.1/10.4.1)
|
| alpine |  | pinDigest |  → `865b95f` |
| grafana/grafana-enterprise | final | pinDigest |  → `703b4a3` |
| postgres |  | pinDigest |  → `056b54f` |
| postgres |  | pinDigest |  → `a7711af` |
| postgres |  | pinDigest |  → `5fd97d3` |
| python | final | pinDigest |  → `cfa6231` |
| python | final | pinDigest |  → `0c5171f` |
| python | final | pinDigest |  → `411fa4d` |
| python | final | pinDigest |  → `6d58c1a` |
| redis |  | pinDigest |  → `6cbef35` |
| zabbix/zabbix-agent |  | pinDigest |  → `2a5989f` |
| zabbix/zabbix-agent |  | pinDigest |  → `0bb96e2` |
| zabbix/zabbix-agent |  | pinDigest |  → `71f1f22` |
| zabbix/zabbix-agent |  | pinDigest |  → `9eab77e` |
| zabbix/zabbix-agent |  | pinDigest |  → `c34ca68` |
| zabbix/zabbix-proxy-sqlite3 |  | pinDigest |  → `a963b30` |
| zabbix/zabbix-server-pgsql |  | pinDigest |  → `a6f748d` |
| zabbix/zabbix-server-pgsql |  | pinDigest |  → `5c1aece` |
| zabbix/zabbix-server-pgsql |  | pinDigest |  → `b3c1451` |
| zabbix/zabbix-server-pgsql |  | pinDigest |  → `dbc5a2a` |
| zabbix/zabbix-server-pgsql |  | pinDigest |  → `b88c636` |
| zabbix/zabbix-web-apache-pgsql |  | pinDigest |  → `9b5ad53` |
| zabbix/zabbix-web-apache-pgsql |  | pinDigest |  → `70a301e` |
| zabbix/zabbix-web-nginx-pgsql |  | pinDigest |  → `08b2b13` |
| zabbix/zabbix-web-nginx-pgsql |  | pinDigest |  → `e034dd9` |
| zabbix/zabbix-web-nginx-pgsql |  | pinDigest |  → `90d9d85` |

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZG9ja2VyIl19-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-09 10:47:29 +01:00
renovate-sh-app[bot]
28c32d4dbf chore(deps): update grafana/plugin-ci-workflows/ci-cd-workflows action to v5.0.0 (#2180)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
|
[grafana/plugin-ci-workflows](https://redirect.github.com/grafana/plugin-ci-workflows)
| action | major | `ci-cd-workflows/v4.3.0` → `ci-cd-workflows/v5.0.0` |
`ci-cd-workflows/v5.1.0` |

---

### Release Notes

<details>
<summary>grafana/plugin-ci-workflows
(grafana/plugin-ci-workflows)</summary>

###
[`vci-cd-workflows/v5.0.0`](https://redirect.github.com/grafana/plugin-ci-workflows/releases/tag/ci-cd-workflows/v5.0.0):
ci-cd-workflows: v5.0.0

[Compare
Source](https://redirect.github.com/grafana/plugin-ci-workflows/compare/ci-cd-workflows/v4.3.0...ci-cd-workflows/v5.0.0)

##### ⚠ BREAKING CHANGES

- **ci:** `universal-zip-url-*` outputs are now URLs rather than paths
- **deps:** Update default Node version to 24 LTS
([#&#8203;439](https://redirect.github.com/grafana/plugin-ci-workflows/issues/439))
- **deps:** Update default golangci-lint version to 2.7.2
([#&#8203;439](https://redirect.github.com/grafana/plugin-ci-workflows/issues/439))
- **deps:** Update default Go version to 1.25
([#&#8203;439](https://redirect.github.com/grafana/plugin-ci-workflows/issues/439))
- **ci:** use pm-detect to understand nodejs package manager
([#&#8203;204](https://redirect.github.com/grafana/plugin-ci-workflows/issues/204))

***

The `package-manager` input has been removed from `ci.yml`. If you were
using it, please remove it from your workflow. The correct package
manager will now be detected automatically from the plugin's source
code. Supported package managers are npm, yarn and pnpm.

***

golangci-lint has been bumped from v1 to v2 in order to support Go 1.25.
The config file format for golangci-lint has changed and has to be
migrated. Please follow [golangci-lint's migration
guide](https://golangci-lint.run/docs/product/migration-guide/) for more
information. If you want to revert to Go 1.24 and golangci-lint v1, add
the following to both your CI and your CD workflows:

```yaml
inputs:
  go-version: "1.24"
  golangci-lint-version: "1.64.8"
```

##### 🎉 Features

- **ci:** use pm-detect to understand nodejs package manager
([#&#8203;204](https://redirect.github.com/grafana/plugin-ci-workflows/issues/204))
([e739fbe](e739fbe504))

##### 🐛 Bug Fixes

- **ci:** `universal-zip-url-*` outputs are now URLs rather than paths
([b5e3ec2](b5e3ec296c))
- **ci:** do not copy backend into the "dist" folder
([b5e3ec2](b5e3ec296c))
- use local exec for playwright test
([#&#8203;451](https://redirect.github.com/grafana/plugin-ci-workflows/issues/451))
([b27d62d](b27d62de5d))

#####  Tests

- **act:** add pre-generated dist mockdata for test plugins
([#&#8203;417](https://redirect.github.com/grafana/plugin-ci-workflows/issues/417))
([cb33db6](cb33db657c))
- add concurrency to pr-checks-test-ci workflow
([630b056](630b0567a9))
- pin actions in pr-checks-test-ci workflow
([630b056](630b0567a9))
- run smoke tests with act
([#&#8203;389](https://redirect.github.com/grafana/plugin-ci-workflows/issues/389))
([0f2f7c6](0f2f7c6fc4))
- use local repository for release please manifest tag when running act
([630b056](630b0567a9))

##### 🔧 Chores

- build and package plugin in its directory, better support for artifact
prefix
([#&#8203;438](https://redirect.github.com/grafana/plugin-ci-workflows/issues/438))
([dbbcc52](dbbcc5276e))
- **deps:** update actions/checkout action to v5.0.1
([#&#8203;413](https://redirect.github.com/grafana/plugin-ci-workflows/issues/413))
([8c591cd](8c591cdfe4))
- **deps:** update actions/checkout action to v6
([#&#8203;437](https://redirect.github.com/grafana/plugin-ci-workflows/issues/437))
([949a63c](949a63c075))
- **deps:** update actions/checkout action to v6.0.1
([#&#8203;455](https://redirect.github.com/grafana/plugin-ci-workflows/issues/455))
([aec5016](aec5016c9a))
- **deps:** update actions/create-github-app-token action to v2.2.0
([#&#8203;435](https://redirect.github.com/grafana/plugin-ci-workflows/issues/435))
([5b2407c](5b2407c17d))
- **deps:** update actions/setup-go action to v6.1.0
([#&#8203;436](https://redirect.github.com/grafana/plugin-ci-workflows/issues/436))
([5f5e089](5f5e089494))
- **deps:** Update default Go version to 1.25
([b1f1b22](b1f1b2282f))
- **deps:** Update default golangci-lint version to 2.7.2
([b1f1b22](b1f1b2282f))
- **deps:** Update default Node version to 24 LTS
([b1f1b22](b1f1b2282f))
- **deps:** update grafana/shared-workflows/trigger-argo-workflow action
to v1.2.1
([#&#8203;433](https://redirect.github.com/grafana/plugin-ci-workflows/issues/433))
([6c260c0](6c260c01bd))
- **deps:** update peter-evans/create-pull-request action to v7.0.9
([#&#8203;434](https://redirect.github.com/grafana/plugin-ci-workflows/issues/434))
([55c4108](55c4108fe0))
- **deps:** update pnpm/action-setup action to v4.2.0
([#&#8203;450](https://redirect.github.com/grafana/plugin-ci-workflows/issues/450))
([5fbf8e6](5fbf8e65a1))
- **deps:** update softprops/action-gh-release action to v2.5.0
([#&#8203;452](https://redirect.github.com/grafana/plugin-ci-workflows/issues/452))
([48548e8](48548e8674))
- **deps:** update step-security/harden-runner action to v2.13.3
([#&#8203;456](https://redirect.github.com/grafana/plugin-ci-workflows/issues/456))
([fccf74b](fccf74bf9e))
- **main:** release plugins-frontend-e2e-against-stack 1.0.0
([#&#8203;430](https://redirect.github.com/grafana/plugin-ci-workflows/issues/430))
([6443ba2](6443ba2a59))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicGx1Z2luLWNpLXdvcmtmbG93cyJdfQ==-->

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2026-01-09 10:46:09 +01:00
renovate-sh-app[bot]
3ea69e2f8e fix(deps): update module golang.org/x/net to v0.48.0 (#2176)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [golang.org/x/net](https://pkg.go.dev/golang.org/x/net) | [`v0.46.0` →
`v0.48.0`](https://cs.opensource.google/go/x/net/+/refs/tags/v0.46.0...refs/tags/v0.48.0)
|
![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fnet/v0.48.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fnet/v0.46.0/v0.48.0?slim=true)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

## Need help?
You can ask for more help in the following Slack channel:
#proj-renovate-self-hosted. In that channel you can also find ADR and
FAQ docs in the Resources section.

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidXBkYXRlLW1pbm9yIl19-->

---------

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Jocelyn Collado-Kuri <jcolladokuri@icloud.com>
2026-01-09 10:45:48 +01:00
70 changed files with 2207 additions and 818 deletions

View File

@@ -3,7 +3,7 @@
# see https://github.com/unknwon/bra/blob/master/templates/default.bra.toml for more configuration options.
[run]
init_cmds = [
["mage", "-v", "build:backend"],
["mage", "-v", "build:debug"],
["mage", "-v" , "reloadPlugin"]
]
watch_all = true
@@ -17,6 +17,6 @@ watch_dirs = [
watch_exts = [".go", ".json"]
build_delay = 2000
cmds = [
["mage", "-v", "build:backend"],
["mage", "-v", "build:debug"],
["mage", "-v" , "reloadPlugin"]
]

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Fix support of applicationids filters with Zabbix problems for versions older than 5.0.x

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Fix when to fetch Zabbix version before issuing new requests

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Support adding custom values in dropdowns for all query types

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Add support for host tags when querying metrics

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Add support for disabled items in Item variable type

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Standardization across Zabbix UI components

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': patch
---
Upgrade react-table to v8

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Moves health check to the backend

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': major
---
Migrates use of DatasourceApi to DatasourceWithBackend

View File

@@ -1,5 +0,0 @@
---
'grafana-zabbix': minor
---
Fix how frontend and backend querying responses are merged

View File

@@ -1,4 +1,4 @@
ARG grafana_version=latest
ARG grafana_version=latest@sha256:703b4a3aff457041dcbd15bf36dbc8bb83cb513b72b0912056985712be4c01bd
ARG grafana_image=grafana-enterprise
FROM grafana/${grafana_image}:${grafana_version}
@@ -7,7 +7,8 @@ ARG anonymous_auth_enabled=true
ARG development=false
ARG TARGETARCH
ARG GO_VERSION=1.25.6
ARG GO_ARCH=${TARGETARCH:-amd64}
ENV DEV "${development}"
# Make it as simple as possible to access the grafana instance for development purposes
@@ -43,7 +44,27 @@ RUN if [ "${development}" = "true" ]; then \
COPY supervisord/supervisord.conf /etc/supervisor.d/supervisord.ini
COPY supervisord/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Installing Go
RUN if [ "${development}" = "true" ]; then \
curl -O -L https://golang.org/dl/go${GO_VERSION}.linux-${GO_ARCH}.tar.gz && \
rm -rf /usr/local/go && \
tar -C /usr/local -xzf go${GO_VERSION}.linux-${GO_ARCH}.tar.gz && \
echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bashrc && \
rm -f go${GO_VERSION}.linux-${GO_ARCH}.tar.gz; \
fi
# Installing delve for debugging
RUN if [ "${development}" = "true" ]; then \
/usr/local/go/bin/go install github.com/go-delve/delve/cmd/dlv@latest; \
fi
# Installing mage for plugin (re)building
RUN if [ "${development}" = "true" ]; then \
git clone https://github.com/magefile/mage; \
cd mage; \
export PATH=$PATH:/usr/local/go/bin; \
go run bootstrap.go; \
fi
# Inject livereload script into grafana index.html
RUN sed -i 's|</body>|<script src="http://localhost:35729/livereload.js"></script></body>|g' /usr/share/grafana/public/views/index.html

View File

@@ -7,11 +7,17 @@ services:
context: .
args:
grafana_image: ${GRAFANA_IMAGE:-grafana-enterprise}
grafana_version: ${GRAFANA_VERSION:-12.2.0}
grafana_version: ${GRAFANA_VERSION:-12.3.1}
development: ${DEVELOPMENT:-false}
anonymous_auth_enabled: ${ANONYMOUS_AUTH_ENABLED:-true}
ports:
- 3000:3000/tcp
- 2345:2345/tcp # delve
security_opt:
- 'apparmor:unconfined'
- 'seccomp:unconfined'
cap_add:
- SYS_PTRACE
volumes:
- ../dist:/var/lib/grafana/plugins/alexanderzobnin-zabbix-app
- ../provisioning:/etc/grafana/provisioning

View File

@@ -5,7 +5,7 @@ user=root
[program:grafana]
user=root
directory=/var/lib/grafana
command=/run.sh
command=bash -c 'while [ ! -f /root/alexanderzobnin-zabbix-app/dist/datasource/gpx_zabbix-datasource* ]; do sleep 1; done; /run.sh'
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
@@ -13,3 +13,35 @@ killasgroup=true
stopasgroup=true
autostart=true
[program:delve]
user=root
command=/bin/bash -c 'pid=""; while [ -z "$pid" ]; do pid=$(pgrep -f gpx_zabbix-datasource); done; /root/go/bin/dlv attach --api-version=2 --headless --continue --accept-multiclient --listen=:2345 $pid'
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=false
stopasgroup=false
autostart=true
autorestart=true
[program:build-watcher]
user=root
command=/bin/bash -c 'while inotifywait -e modify,create,delete -r /var/lib/grafana/plugins/alexanderzobnin-zabbix-app; do echo "Change detected, restarting delve...";supervisorctl restart delve; done'
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true
[program:mage-watcher]
user=root
environment=PATH="/usr/local/go/bin:/root/go/bin:%(ENV_PATH)s"
directory=/root/alexanderzobnin-zabbix-app
command=/bin/bash -c 'git config --global --add safe.directory /root/alexanderzobnin-zabbix-app && mage -v watch'
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true

View File

@@ -14,11 +14,11 @@ jobs:
compatibility-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.25'

View File

@@ -14,11 +14,11 @@ jobs:
compatibility-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.25'

View File

@@ -14,11 +14,11 @@ jobs:
compatibility-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.25'

View File

@@ -14,11 +14,11 @@ jobs:
compatibility-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.25'

View File

@@ -14,11 +14,11 @@ jobs:
compatibility-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version: '1.25'

View File

@@ -3,6 +3,7 @@ run-name: Deploy ${{ inputs.branch }} to ${{ inputs.environment }} by @${{ githu
permissions:
attestations: write
contents: write
pull-requests: read
id-token: write
on:
@@ -27,7 +28,7 @@ on:
jobs:
cd:
name: CD
uses: grafana/plugin-ci-workflows/.github/workflows/cd.yml@ci-cd-workflows/v4.3.0
uses: grafana/plugin-ci-workflows/.github/workflows/cd.yml@ci-cd-workflows/v6.1.0
with:
golangci-lint-version: '2.7.2'
go-version: '1.25.5'
@@ -36,3 +37,4 @@ jobs:
docs-only: ${{ fromJSON(github.event.inputs.docs-only) }}
run-playwright: true
github-draft-release: false
run-playwright-with-skip-grafana-react-19-preview-image: true

View File

@@ -12,9 +12,10 @@ on:
jobs:
ci:
name: CI
uses: grafana/plugin-ci-workflows/.github/workflows/ci.yml@ci-cd-workflows/v4.3.0
uses: grafana/plugin-ci-workflows/.github/workflows/ci.yml@ci-cd-workflows/v6.1.0
with:
go-version: '1.25.5'
golangci-lint-version: '2.7.2'
plugin-version-suffix: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || '' }}
run-playwright: true
run-playwright-with-skip-grafana-react-19-preview-image: true

1
.gitignore vendored
View File

@@ -2,7 +2,6 @@
*.sublime-project
.idea/
.vscode
*.bat
.DS_Store

36
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,36 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Standalone debug mode",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/pkg",
"env": {},
"args": [
"-standalone"
]
},
{
"name": "Attach to plugin backend in docker",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2345,
"host": "127.0.0.1",
"showLog": true,
"trace": "log",
"logOutput": "rpc",
"substitutePath": [
{
"from": "${workspaceFolder}",
"to": "/root/alexanderzobnin-zabbix-app"
}
]
}
]
}

View File

@@ -1,5 +1,39 @@
# Change Log
## 6.1.2
🐛 Fix silent removal of itemTagFilter when no tags match regex
🐛 Enhance the problems panel with the ability to convert specific tags to columns. Single or multiple tags supported.
🐛 Fix column visibility toggles for problems panel
## 6.1.1
🐛 Fix moment value rendering issue
🐛 Fix proxies dropdown in ProblemsQueryEditor
## 6.1.0
🎉 Migrates use of DatasourceApi to DatasourceWithBackend
🚀 Fix support of `applicationids` filters with Zabbix problems for versions older than 5.0.x
🚀 Fix when to fetch Zabbix version before issuing new requests
🚀 Support adding custom values in dropdowns for all query types
🚀 Add support for host tags when querying metrics
🚀 Add support for disabled items in Item variable type
🚀 Standardization across Zabbix UI components
🚀 Moves health check to the backend
🚀 Fix how frontend and backend querying responses are merged
🐛 Upgrade react-table to v8
## 6.0.3
### Patch Changes

104
CLAUDE.md Normal file
View File

@@ -0,0 +1,104 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Grafana-Zabbix is a hybrid Grafana plugin connecting Grafana to Zabbix monitoring infrastructure. It consists of three components:
- **Zabbix App** (`/src`) - Container app plugin
- **Zabbix Data Source** (`/src/datasource`) - TypeScript frontend + Go backend for querying Zabbix
- **Problems Panel** (`/src/panel-triggers`) - React panel for displaying Zabbix problems/triggers
## Build Commands
```bash
# Install all dependencies
make install # or: yarn install && go install -v ./pkg/
# Development
yarn dev # Watch mode for frontend
make run-backend # Watch mode for backend (uses bra)
# Production build
make build # or: yarn build && mage -v build:backend
# Distribution (all platforms)
make dist
# After building, restart Grafana to reload the plugin
podman container stop grafana && podman container start grafana
```
## Testing
```bash
# Frontend tests (Jest)
yarn test # Watch mode
yarn test:ci # CI mode, all tests
# Run specific test file
yarn test datasource.test.ts
yarn test Problems.test.tsx
# Backend tests (Go)
go test ./pkg/...
```
Test files are located alongside source code with `.test.ts` or `.test.tsx` extensions:
- `src/datasource/specs/*.test.ts`
- `src/datasource/components/**/*.test.tsx`
- `src/datasource/zabbix/**/*.test.ts`
- `src/panel-triggers/components/**/*.test.tsx`
## Linting and Type Checking
```bash
yarn lint # Check for linting errors
yarn lint:fix # Auto-fix lint and formatting issues
yarn typecheck # TypeScript type checking
```
## Development Environment
```bash
yarn server # Start Grafana + Zabbix via Docker Compose
yarn server:down # Stop and remove containers
```
Docker setup in `/devenv/` includes multiple Zabbix versions (5.0, 6.0, 7.0, 7.2, 7.4) for compatibility testing.
## Architecture
**Frontend-Backend Communication**: Frontend queries go through Grafana's backend proxy to the plugin backend executable (`gpx_zabbix-datasource`), which handles Zabbix API calls. Uses gRPC via Grafana Plugin SDK.
**Key Frontend Packages**:
- `/src/datasource/datasource.ts` - Main ZabbixDatasource class
- `/src/datasource/zabbix/` - Zabbix API client logic
- `/src/datasource/components/` - Query editor, config editor components
- `/src/panel-triggers/components/` - Problems panel components
**Key Backend Packages** (`/pkg/`):
- `datasource/` - Main backend logic
- `zabbix/` - Zabbix API interactions
- `zabbixapi/` - Low-level API connector
- `cache/` - Caching layer
## Requirements
- Node.js: v24 (see `.nvmrc`)
- Yarn: v4.12.0
- Go: 1.25
- Grafana: >=11.6.0
## PR Workflow
Run `yarn changeset` to create a changeset file for your PR. This is required for version bumping and changelog generation.
## Debugging Backend
```bash
make build-debug # Build with debug flags
./debug-backend.sh # Attach delve debugger (after starting Grafana)
```
VS Code debug config connects to delve on port 3222.

View File

@@ -4,11 +4,11 @@
```sh
# install frontend deps
yarn install --pure-lockfile
yarn install
# build frontend
yarn build
#build backend for current platform
mage -v build:backend
#build backend
mage -v
```
## Rebuild backend on changes
@@ -19,31 +19,31 @@ mage watch
## Debugging backend plugin
For debugging backend part written on Go, you should go through a few steps. First, build a plugin with special flags for debugging:
The plugin supports two debugging modes for the Go backend:
### Standalone Debug Mode
This mode allows you to run and debug the plugin locally:
1. Use the **"Standalone debug mode"** configuration in VS Code (already configured in `.vscode/launch.json`)
2. Set breakpoints in your Go code
3. The plugin will start in standalone mode with the `-standalone` flag
4. Run your local grafana instance
### Debugging with Docker (Recommended for Grafana Integration)
For debugging the backend plugin while it's running inside Grafana in Docker:
1. Run the docker compose file with the following command in any of the devenv folders:
```sh
make build-debug
DEVELOPMENT=true docker compose up --build -d
```
Then, configure your editor to connect to [delve](https://github.com/go-delve/delve) debugger running in headless mode. This is an example for VS Code:
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug backend plugin",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 3222,
"host": "127.0.0.1"
}
]
}
```
Finally, run grafana-server and then execute `./debug-backend.sh` from grafana-zabbix root folder. This script will attach delve to running plugin. Now you can go to the VS Code and run _Debug backend plugin_ debug config.
1. Attach VS Code debugger:
- Use the **"Attach to plugin backend in docker"** configuration in VS Code (already configured in `.vscode/launch.json`)
- Set breakpoints in your Go code
- The debugger will connect to delve running in the Docker container
## Submitting PR

View File

@@ -3,7 +3,7 @@ all: install build test lint
# Install dependencies
install:
# Frontend
yarn install --pure-lockfile
yarn install
# Backend
go install -v ./pkg/
go install golang.org/x/lint/golint@latest

View File

@@ -29,13 +29,19 @@
"src/**",
"pkg/**"
],
"ignoreRegExpList": ["import\\s*\\((.|[\r\n])*?\\)", "import\\s*.*\".*?\"", "\\[@.+\\]"],
"ignoreRegExpList": [
"import\\s*\\((.|[\r\n])*?\\)",
"import\\s*.*\".*?\"",
"\\[@.+\\]"
],
"words": [
"alexanderzobnin",
"applicationids",
"datapoint",
"datapoints",
"datasource",
"datasources",
"devenv",
"dompurify",
"eventid",
"eventids",

View File

@@ -1,4 +1,4 @@
FROM python:3
FROM python:3@sha256:17bc9f1d032a760546802cc4e406401eb5fe99dbcb4602c91628e73672fa749c
ENV ZBX_API_URL=http://zabbix-web
ENV ZBX_API_USER="Admin"

View File

@@ -1,6 +1,6 @@
services:
ssl-cert:
image: alpine:latest
image: alpine:latest@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
command: |
sh -c "if [ ! -f /certs/nginx.crt ] || [ ! -f /certs/nginx.key ]; then
apk add --no-cache openssl &&
@@ -19,14 +19,13 @@ services:
file: ../../.config/docker-compose-base.yaml
service: grafana
volumes:
- ../..:/grafana-zabbix
- ../dashboards:/devenv/dashboards
- '../datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml'
- '../dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml'
# Zabbix
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-5.0-latest
image: zabbix/zabbix-server-pgsql:alpine-5.0-latest@sha256:b88c636ec3298529358914aa7fd04d3f7ae3da0eab261b405cb2a9fcb4fa5eae
ports:
- '10051:10051'
depends_on:
@@ -39,7 +38,7 @@ services:
POSTGRES_DB: zabbix
zabbix-web:
image: zabbix/zabbix-web-nginx-pgsql:alpine-5.0-latest
image: zabbix/zabbix-web-nginx-pgsql:alpine-5.0-latest@sha256:90d9d85d42d46a4978091bd6deb405e6c8486fd53af5720a6f7a6135e6baaa4b
ports:
- '443:443'
- '8188:8080'
@@ -65,7 +64,7 @@ services:
- ../nginx/.htpasswd:/etc/nginx/.htpasswd:ro
database:
image: postgres:14
image: postgres:18@sha256:5773fe724c49c42a7a9ca70202e11e1dff21fb7235b335a73f39297d200b73a2
ports:
- '15432:5432'
environment:
@@ -73,13 +72,13 @@ services:
POSTGRES_PASSWORD: zabbix
zabbix-agent:
image: zabbix/zabbix-agent:alpine-5.0-latest
image: zabbix/zabbix-agent:alpine-5.0-latest@sha256:c34ca68c3120b1918bceb394f2275f6aa67ddecce641a0033fdea5c84b89731d
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
zabbix-proxy:
image: zabbix/zabbix-proxy-sqlite3:alpine-5.0-latest
image: zabbix/zabbix-proxy-sqlite3:alpine-5.0-latest@sha256:a963b30b2e4352be890c93f599749d42a8e6a8e549629ccc6b30de437ecd4a5f
environment:
ZBX_PROXYMODE: 0
ZBX_HOSTNAME: zabbix-proxy
@@ -87,7 +86,7 @@ services:
ZBX_SERVER_PORT: 10051
zabbix-agent-proxy:
image: zabbix/zabbix-agent:alpine-5.0-latest
image: zabbix/zabbix-agent:alpine-5.0-latest@sha256:c34ca68c3120b1918bceb394f2275f6aa67ddecce641a0033fdea5c84b89731d
environment:
ZBX_SERVER_HOST: zabbix-proxy
ZBX_SERVER_PORT: 10051
@@ -117,7 +116,7 @@ services:
# backend
redis_backend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_backend_01:
build: ../zas-agent
@@ -135,7 +134,7 @@ services:
# frontend
redis_frontend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_frontend_01:
build: ../zas-agent

View File

@@ -1,4 +1,4 @@
FROM python:2.7
FROM python:2.7@sha256:cfa62318c459b1fde9e0841c619906d15ada5910d625176e24bf692cf8a2601d
ENV ZBX_API_URL=http://zabbix-web:8080
ENV ZBX_API_USER="Admin"

View File

@@ -1,6 +1,6 @@
services:
ssl-cert:
image: alpine:latest
image: alpine:latest@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
command: |
sh -c "if [ ! -f /certs/nginx.crt ] || [ ! -f /certs/nginx.key ]; then
apk add --no-cache openssl &&
@@ -19,14 +19,13 @@ services:
file: ../../.config/docker-compose-base.yaml
service: grafana
volumes:
- ../..:/grafana-zabbix
- ../dashboards:/devenv/dashboards
- '../datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml'
- '../dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml'
# Zabbix
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-6.0-latest
image: zabbix/zabbix-server-pgsql:alpine-6.0-latest@sha256:b34303498b75e4a13d76211f250d5a831f746fc13d441d89d1dcea04b64adf4c
ports:
- '10051:10051'
depends_on:
@@ -43,7 +42,7 @@ services:
ZBX_DEBUGLEVEL: 3
zabbix-web:
image: zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest
image: zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest@sha256:b38d7ae7c073a8f4d0488315cd2c2131ab08294076bba4650f7b3ab065d9c07d
ports:
- '443:443'
- '8188:8080'
@@ -64,7 +63,7 @@ services:
POSTGRES_DB: zabbix
database:
image: postgres:15
image: postgres:18@sha256:5773fe724c49c42a7a9ca70202e11e1dff21fb7235b335a73f39297d200b73a2
ports:
- '15432:5432'
command: postgres -c 'max_connections=1000'
@@ -73,7 +72,7 @@ services:
POSTGRES_PASSWORD: zabbix
zabbix-agent:
image: zabbix/zabbix-agent:alpine-6.0-latest
image: zabbix/zabbix-agent:alpine-6.0-latest@sha256:4686ff4dd5c7e3ea43e9653e35019039e567c544495f55fcb949c2cdd0a6cf50
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
@@ -99,7 +98,7 @@ services:
# backend
redis_backend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_backend_01:
build: ../zas-agent
@@ -118,7 +117,7 @@ services:
# frontend
redis_frontend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_frontend_01:
build: ../zas-agent

View File

@@ -1,4 +1,4 @@
FROM python:3.12-slim-bullseye
FROM python:3.12-slim-bullseye@sha256:411fa4dcfdce7e7a3057c45662beba9dcd4fa36b2e50a2bfcd6c9333e59bf0db
ENV ZBX_API_URL=http://zabbix-web:8080
ENV ZBX_API_USER="Admin"

View File

@@ -1,6 +1,6 @@
services:
ssl-cert:
image: alpine:latest
image: alpine:latest@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
command: |
sh -c "if [ ! -f /certs/nginx.crt ] || [ ! -f /certs/nginx.key ]; then
apk add --no-cache openssl &&
@@ -19,14 +19,13 @@ services:
file: ../../.config/docker-compose-base.yaml
service: grafana
volumes:
- ../..:/grafana-zabbix
- ../dashboards:/devenv/dashboards
- '../datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml'
- '../dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml'
# Zabbix
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-7.0-latest
image: zabbix/zabbix-server-pgsql:alpine-7.0-latest@sha256:2cec4dde78b1ea1ad483ea823f91dff45abd013779909db004f3568a596c3bde
ports:
- '10051:10051'
depends_on:
@@ -43,7 +42,7 @@ services:
ZBX_DEBUGLEVEL: 3
zabbix-web:
image: zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest
image: zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest@sha256:927b9a2836ee0ae6f44c4c749e50042931e87c7d9866b7d3bbd3901318ae63eb
ports:
- '443:443'
- '8188:8080'
@@ -64,7 +63,7 @@ services:
POSTGRES_DB: zabbix
database:
image: postgres:16
image: postgres:18@sha256:5773fe724c49c42a7a9ca70202e11e1dff21fb7235b335a73f39297d200b73a2
ports:
- '15432:5432'
command: postgres -c 'max_connections=1000'
@@ -73,7 +72,7 @@ services:
POSTGRES_PASSWORD: zabbix
zabbix-agent:
image: zabbix/zabbix-agent:alpine-7.0-latest
image: zabbix/zabbix-agent:alpine-7.0-latest@sha256:52865010468af7f6dc3e3dbd45b645c32b8d133f4a230301cea26ffa679d5cc4
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
@@ -99,7 +98,7 @@ services:
# backend
redis_backend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_backend_01:
build: ../zas-agent
@@ -118,7 +117,7 @@ services:
# frontend
redis_frontend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_frontend_01:
build: ../zas-agent

View File

@@ -1,4 +1,4 @@
FROM python:3.12-slim-bullseye
FROM python:3.12-slim-bullseye@sha256:411fa4dcfdce7e7a3057c45662beba9dcd4fa36b2e50a2bfcd6c9333e59bf0db
ENV ZBX_API_URL=http://zabbix-web:8080
ENV ZBX_API_USER="Admin"

View File

@@ -5,14 +5,13 @@ services:
file: ../../.config/docker-compose-base.yaml
service: grafana
volumes:
- ../..:/grafana-zabbix
- ../dashboards:/devenv/dashboards
- '../datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml'
- '../dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml'
# Zabbix
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-7.2-latest
image: zabbix/zabbix-server-pgsql:alpine-7.2-latest@sha256:5c1aeceb24d6a07b64667a97d42053e3421c207aec39aca86d87980a30b01f5b
ports:
- '10051:10051'
depends_on:
@@ -29,7 +28,7 @@ services:
ZBX_DEBUGLEVEL: 3
zabbix-web:
image: zabbix/zabbix-web-apache-pgsql:alpine-7.2-latest
image: zabbix/zabbix-web-apache-pgsql:alpine-7.2-latest@sha256:70a301e5c25b9db11bde09ec5b1ba5c25480c3c63e70f01d51534d9648627ff6
ports:
- '8188:8080'
depends_on:
@@ -45,7 +44,7 @@ services:
POSTGRES_DB: zabbix
database:
image: postgres:16
image: postgres:18@sha256:5773fe724c49c42a7a9ca70202e11e1dff21fb7235b335a73f39297d200b73a2
ports:
- '15432:5432'
command: postgres -c 'max_connections=1000'
@@ -54,7 +53,7 @@ services:
POSTGRES_PASSWORD: zabbix
zabbix-agent:
image: zabbix/zabbix-agent:alpine-7.2-latest
image: zabbix/zabbix-agent:alpine-7.2-latest@sha256:0bb96e2afe24c71dcd38e16f9dff6e56b4aebadff5267ce354b39a79f4a07255
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
@@ -80,7 +79,7 @@ services:
# backend
redis_backend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_backend_01:
build: ../zas-agent
@@ -99,7 +98,7 @@ services:
# frontend
redis_frontend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_frontend_01:
build: ../zas-agent

View File

@@ -1,4 +1,4 @@
FROM python:3.13-slim-bookworm
FROM python:3.13-slim-bookworm@sha256:97e9392d12279f8c180eb80f0c7c0f3dfe5650f0f2573f7ad770aea58f75ed12
ENV ZBX_API_URL=http://zabbix-web:8080
ENV ZBX_API_USER="Admin"

View File

@@ -5,14 +5,13 @@ services:
file: ../../.config/docker-compose-base.yaml
service: grafana
volumes:
- ../..:/grafana-zabbix
- ../dashboards:/devenv/dashboards
- '../datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml'
- '../dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml'
# Zabbix
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-7.4-latest
image: zabbix/zabbix-server-pgsql:alpine-7.4-latest@sha256:033791214ab8146a4663c56dd6b46f742f03363e441d928216202136d094e154
ports:
- '10051:10051'
depends_on:
@@ -29,7 +28,7 @@ services:
ZBX_DEBUGLEVEL: 3
zabbix-web:
image: zabbix/zabbix-web-apache-pgsql:alpine-7.4-latest
image: zabbix/zabbix-web-apache-pgsql:alpine-7.4-latest@sha256:f7357956bb66ac1c18db0b93a2af1c60ecea9f2ce6366f55bfb5cd6000415441
ports:
- '8188:8080'
depends_on:
@@ -45,7 +44,7 @@ services:
POSTGRES_DB: zabbix
database:
image: postgres:16
image: postgres:18@sha256:5773fe724c49c42a7a9ca70202e11e1dff21fb7235b335a73f39297d200b73a2
ports:
- '15432:5432'
command: postgres -c 'max_connections=1000'
@@ -54,7 +53,7 @@ services:
POSTGRES_PASSWORD: zabbix
zabbix-agent:
image: zabbix/zabbix-agent:alpine-7.4-latest
image: zabbix/zabbix-agent:alpine-7.4-latest@sha256:cfc45062ace0e7d0a12e2e043026c1df53b5eceb91ea66dced9fbcad40ae6cc0
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
@@ -80,7 +79,7 @@ services:
# backend
redis_backend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_backend_01:
build: ../zas-agent
@@ -99,7 +98,7 @@ services:
# frontend
redis_frontend:
image: redis:alpine
image: redis:alpine@sha256:6cbef353e480a8a6e7f10ec545f13d7d3fa85a212cdcc5ffaf5a1c818b9d3798
zas_frontend_01:
build: ../zas-agent

View File

@@ -1,4 +1,4 @@
FROM python:2.7
FROM python:2.7@sha256:cfa62318c459b1fde9e0841c619906d15ada5910d625176e24bf692cf8a2601d
# ENV ZAS_SOURCE_URL=https://github.com/vulogov/zas_agent/archive/master.zip
# ENV ZAS_ARC_NAME=zas_agent-master

62
go.mod
View File

@@ -1,6 +1,6 @@
module github.com/alexanderzobnin/grafana-zabbix
go 1.25
go 1.25.5
// Go 1.24 enabled the post-quantum key exchange mechanism
// X25519MLKEM768 by default. It can cause issues with some TLS servers
@@ -11,17 +11,17 @@ godebug tlsmlkem=0
require (
github.com/bitly/go-simplejson v0.5.1
github.com/dlclark/regexp2 v1.11.5
github.com/grafana/grafana-plugin-sdk-go v0.284.0
github.com/grafana/grafana-plugin-sdk-go v0.286.0
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/prometheus/client_golang v1.23.2
github.com/stretchr/testify v1.11.1
golang.org/x/net v0.46.0
golang.org/x/net v0.49.0
gotest.tools v2.2.0+incompatible
)
require (
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/apache/arrow-go/v18 v18.4.1 // indirect
github.com/apache/arrow-go/v18 v18.5.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
@@ -35,20 +35,20 @@ require (
github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/flatbuffers v25.2.10+incompatible // indirect
github.com/google/flatbuffers v25.9.23+incompatible // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grafana/otel-profiling-go v0.5.1 // indirect
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-plugin v1.7.0 // indirect
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/jaegertracing/jaeger-idl v0.5.0 // indirect
github.com/jaegertracing/jaeger-idl v0.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/compress v1.18.2 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/magefile/mage v1.15.0 // indirect
github.com/mattetti/filebuffer v1.0.1 // indirect
@@ -64,7 +64,7 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.67.2 // indirect
github.com/prometheus/common v0.67.4 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
@@ -73,31 +73,31 @@ require (
github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect
github.com/urfave/cli v1.22.17 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.38.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.32.0 // indirect
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.39.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.33.0 // indirect
go.opentelemetry.io/otel v1.39.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 // indirect
go.opentelemetry.io/otel/metric v1.39.0 // indirect
go.opentelemetry.io/otel/sdk v1.39.0 // indirect
go.opentelemetry.io/otel/trace v1.39.0 // indirect
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 // indirect
golang.org/x/mod v0.28.0 // indirect
golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 // indirect
golang.org/x/text v0.30.0 // indirect
golang.org/x/tools v0.37.0 // indirect
golang.org/x/mod v0.31.0 // indirect
golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.40.0 // indirect
golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect
golang.org/x/text v0.33.0 // indirect
golang.org/x/tools v0.40.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797 // indirect
google.golang.org/grpc v1.76.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
google.golang.org/grpc v1.78.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

132
go.sum
View File

@@ -3,8 +3,8 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/apache/arrow-go/v18 v18.4.1 h1:q/jVkBWCJOB9reDgaIZIdruLQUb1kbkvOnOFezVH1C4=
github.com/apache/arrow-go/v18 v18.4.1/go.mod h1:tLyFubsAl17bvFdUAy24bsSvA/6ww95Iqi67fTpGu3E=
github.com/apache/arrow-go/v18 v18.5.0 h1:rmhKjVA+MKVnQIMi/qnM0OxeY4tmHlN3/Pvu+Itmd6s=
github.com/apache/arrow-go/v18 v18.5.0/go.mod h1:F1/wPb3bUy6ZdP4kEPWC7GUZm+yDmxXFERK6uDSkhr8=
github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc=
github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -51,8 +51,8 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/flatbuffers v25.9.23+incompatible h1:rGZKv+wOb6QPzIdkM2KxhBZCDrA0DeN6DNmRDrqIsQU=
github.com/google/flatbuffers v25.9.23+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
@@ -61,8 +61,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/grafana/grafana-plugin-sdk-go v0.284.0 h1:1bK7eWsnPBLUWDcWJWe218Ik5ad0a5JpEL4mH9ry7Ws=
github.com/grafana/grafana-plugin-sdk-go v0.284.0/go.mod h1:lHPniaSxq3SL5MxDIPy04TYB1jnTp/ivkYO+xn5Rz3E=
github.com/grafana/grafana-plugin-sdk-go v0.286.0 h1:nrG/XLDpYuUONVpVVGIUxPJdWeXGHM/47qIAnuDkdjg=
github.com/grafana/grafana-plugin-sdk-go v0.286.0/go.mod h1:cNFa2EpURNF5Hy15kH7HfVdprNu+UEmNZx7TMWVdctY=
github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 h1:c1Us8i6eSmkW+Ez05d3co8kasnuOY813tbMN8i/a3Og=
@@ -71,16 +71,16 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA=
github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8=
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
github.com/jaegertracing/jaeger-idl v0.5.0 h1:zFXR5NL3Utu7MhPg8ZorxtCBjHrL3ReM1VoB65FOFGE=
github.com/jaegertracing/jaeger-idl v0.5.0/go.mod h1:ON90zFo9eoyXrt9F/KN8YeF3zxcnujaisMweFY/rg5k=
github.com/jaegertracing/jaeger-idl v0.6.0 h1:LOVQfVby9ywdMPI9n3hMwKbyLVV3BL1XH2QqsP5KTMk=
github.com/jaegertracing/jaeger-idl v0.6.0/go.mod h1:mpW0lZfG907/+o5w5OlnNnig7nHJGT3SfKmRqC42HGQ=
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -91,8 +91,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk=
github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -147,15 +147,15 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.67.2 h1:PcBAckGFTIHt2+L3I33uNRTlKTplNzFctXcWhPyAEN8=
github.com/prometheus/common v0.67.2/go.mod h1:63W3KZb1JOKgcjlIr64WW/LvFGAqKPj0atm+knVGEko=
github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc=
github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -192,38 +192,38 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 h1:2pn7OzMewmYRiNtv1doZnLo3gONcnMHlFnmOR8Vgt+8=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0/go.mod h1:rjbQTDEPQymPE0YnRQp9/NuPwwtL0sesz/fnqRW/v84=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg=
go.opentelemetry.io/contrib/propagators/jaeger v1.38.0 h1:nXGeLvT1QtCAhkASkP/ksjkTKZALIaQBIW+JSIw1KIc=
go.opentelemetry.io/contrib/propagators/jaeger v1.38.0/go.mod h1:oMvOXk78ZR3KEuPMBgp/ThAMDy9ku/eyUVztr+3G6Wo=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.32.0 h1:oPW/SRFyHgIgxrvNhSBzqvZER2N5kRlci3/rGTOuyWo=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.32.0/go.mod h1:B9Oka5QVD0bnmZNO6gBbBta6nohD/1Z+f9waH2oXyBs=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 h1:RN3ifU8y4prNWeEnQp2kRRHz8UwonAEYZl8tUzHEXAk=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0/go.mod h1:habDz3tEWiFANTo6oUE99EmaFUrCNYAAg3wiVmusm70=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0 h1:OXSUzgmIFkcC4An+mv+lqqZSndTffXpjAyoR+1f8k/A=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0/go.mod h1:1A4GVLFIm54HFqVdOpWmukap7rgb0frrE3zWXohLPdM=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ=
go.opentelemetry.io/contrib/propagators/jaeger v1.39.0 h1:Gz3yKzfMSEFzF0Vy5eIpu9ndpo4DhXMCxsLMF0OOApo=
go.opentelemetry.io/contrib/propagators/jaeger v1.39.0/go.mod h1:2D/cxxCqTlrday0rZrPujjg5aoAdqk1NaNyoXn8FJn8=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.33.0 h1:RcFp4UxGTE2VQQ0M7s24YRUShEJ5D5JDnd5g2EaTh6E=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.33.0/go.mod h1:y6oMwgsv+yWYCLRigU6Pp07/x4KZUEh8LIPTSUnQKbQ=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk=
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8ESIOlwJAEGTkkf34DesGRAc/Pn8qJ7k3r/42LM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
@@ -235,19 +235,19 @@ golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 h1:TQwNpfvNkxAVlItJf6Cr5JTsV
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -260,20 +260,20 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8=
golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE=
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA=
golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -282,14 +282,14 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797 h1:CirRxTOwnRWVLKzDNrs0CXAaVozJoR4G9xvdRecrdpk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797/go.mod h1:HSkG/KdJWusxU1F6CNrwNDjBMgisKxGnc5dAZfT0mjQ=
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls=
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=
google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

View File

@@ -1,6 +1,8 @@
{
"name": "grafana-zabbix",
"version": "6.0.3",
"version": "6.2-rit",
"description": "Zabbix plugin for Grafana",
"homepage": "http://grafana-zabbix.org",
"bugs": {
@@ -42,37 +44,37 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@babel/core": "7.28.5",
"@babel/core": "7.28.6",
"@changesets/cli": "2.29.8",
"@grafana/e2e-selectors": "12.3.1",
"@grafana/eslint-config": "9.0.0",
"@grafana/plugin-e2e": "3.1.1",
"@grafana/plugin-e2e": "3.1.4",
"@grafana/tsconfig": "2.0.1",
"@playwright/test": "1.57.0",
"@stylistic/eslint-plugin-ts": "4.4.1",
"@swc/core": "1.15.8",
"@swc/core": "1.15.10",
"@swc/helpers": "0.5.18",
"@swc/jest": "0.2.39",
"@tanstack/react-table": "8.21.3",
"@testing-library/dom": "^10.4.1",
"@testing-library/dom": "10.4.1",
"@testing-library/jest-dom": "6.9.1",
"@testing-library/react": "16.3.1",
"@testing-library/react": "16.3.2",
"@types/grafana": "github:CorpGlory/types-grafana",
"@types/jest": "30.0.0",
"@types/lodash": "4.17.21",
"@types/node": "25.0.3",
"@types/lodash": "4.17.23",
"@types/node": "25.0.10",
"@types/react": "18.3.27",
"@types/react-dom": "18.3.7",
"@typescript-eslint/eslint-plugin": "8.52.0",
"@typescript-eslint/parser": "8.52.0",
"@typescript-eslint/eslint-plugin": "8.53.1",
"@typescript-eslint/parser": "8.53.1",
"autoprefixer": "10.4.23",
"copy-webpack-plugin": "13.0.1",
"cspell": "9.4.0",
"cspell": "9.6.0",
"css-loader": "7.1.2",
"eslint": "9.39.2",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-jsdoc": "61.5.0",
"eslint-plugin-prettier": "5.5.4",
"eslint-plugin-jsdoc": "62.3.1",
"eslint-plugin-prettier": "5.5.5",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "7.0.1",
"eslint-webpack-plugin": "5.0.2",
@@ -82,20 +84,20 @@
"imports-loader": "5.0.0",
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"lodash": "4.17.21",
"mini-css-extract-plugin": "2.9.4",
"lodash": "4.17.23",
"mini-css-extract-plugin": "2.10.0",
"moment": "2.30.1",
"postcss": "8.5.6",
"postcss-loader": "8.2.0",
"postcss-reporter": "7.1.0",
"postcss-scss": "4.0.9",
"prettier": "3.7.4",
"prettier": "3.8.1",
"replace-in-file-webpack-plugin": "1.0.6",
"sass": "1.97.2",
"sass": "1.97.3",
"sass-loader": "16.0.6",
"semver": "7.7.3",
"style-loader": "4.0.0",
"swc-loader": "0.2.6",
"swc-loader": "0.2.7",
"terser-webpack-plugin": "5.3.16",
"ts-node": "10.9.2",
"tsconfig-paths": "4.2.0",

View File

@@ -4,20 +4,25 @@ import (
"context"
"errors"
"fmt"
"net/http"
"time"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/alexanderzobnin/grafana-zabbix/pkg/httpclient"
"github.com/alexanderzobnin/grafana-zabbix/pkg/metrics"
"github.com/alexanderzobnin/grafana-zabbix/pkg/settings"
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbix"
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbixapi"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
)
var (
ErrNonMetricQueryNotSupported = errors.New("non-metrics queries are not supported")
test = errors.New("This is a test error")
)
type ZabbixDatasource struct {
@@ -113,6 +118,11 @@ func (ds *ZabbixDatasource) QueryData(ctx context.Context, req *backend.QueryDat
return nil, err
}
queryTimeout := zabbixDS.Settings.QueryTimeout
if queryTimeout <= 0 {
queryTimeout = 60 * time.Second // Default to 60 seconds if not configured
}
for _, q := range req.Queries {
res := backend.DataResponse{}
query, err := ReadQuery(q)
@@ -122,22 +132,56 @@ func (ds *ZabbixDatasource) QueryData(ctx context.Context, req *backend.QueryDat
} else if err := ValidateTimeRange(query.TimeRange); err != nil {
// Validate time range before processing any query
res = backend.ErrorResponseWithErrorSource(err)
} else if query.QueryType == MODE_METRICS {
frames, err := zabbixDS.queryNumericItems(ctx, &query)
if err != nil {
res = backend.ErrorResponseWithErrorSource(err)
} else {
res.Frames = append(res.Frames, frames...)
}
} else if query.QueryType == MODE_ITEMID {
frames, err := zabbixDS.queryItemIdData(ctx, &query)
if err != nil {
res = backend.ErrorResponseWithErrorSource(err)
} else {
res.Frames = append(res.Frames, frames...)
}
} else {
res = backend.ErrorResponseWithErrorSource(backend.DownstreamError(ErrNonMetricQueryNotSupported))
// Create a context with timeout for this specific query
queryCtx, cancel := context.WithTimeout(ctx, queryTimeout)
// Execute query with timeout context in an anonymous function to ensure cancel is called after each iteration
func() {
defer cancel()
var frames []*data.Frame
var queryErr error
switch query.QueryType {
case MODE_METRICS:
frames, queryErr = zabbixDS.queryNumericItems(queryCtx, &query)
case MODE_ITEMID:
frames, queryErr = zabbixDS.queryItemIdData(queryCtx, &query)
case MODE_PROBLEMS:
queryErr = backend.DownstreamError(test) //send a test error
case MODE_PROBLEMS_ALERTING:
frames, queryErr = zabbixDS.queryProblemsAlerting(queryCtx, &query)
default:
queryErr = backend.DownstreamError(ErrNonMetricQueryNotSupported)
}
// Check if query timed out
if queryErr != nil {
if errors.Is(queryCtx.Err(), context.DeadlineExceeded) {
// Query exceeded the configured timeout
timeoutMsg := fmt.Sprintf(
"Query execution exceeded maximum allowed time (%v). Query was automatically terminated to prevent excessive resource consumption.",
queryTimeout,
)
ds.logger.Warn(
"Query timeout exceeded",
"refId", q.RefID,
"queryType", query.QueryType,
"timeout", queryTimeout,
"datasourceId", req.PluginContext.DataSourceInstanceSettings.ID,
)
res = backend.ErrorResponseWithErrorSource(
backend.DownstreamError(fmt.Errorf("query timeout: %s", timeoutMsg)),
)
res.Status = http.StatusRequestTimeout
} else {
res = backend.ErrorResponseWithErrorSource(queryErr)
}
} else {
res.Frames = append(res.Frames, frames...)
}
}()
}
qdr.Responses[q.RefID] = res
}

View File

@@ -2,8 +2,12 @@ package datasource
import (
"context"
"encoding/json"
"strings"
"testing"
"time"
"github.com/alexanderzobnin/grafana-zabbix/pkg/settings"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"gotest.tools/assert"
)
@@ -66,3 +70,101 @@ func TestZabbixBackend_getCachedDatasource(t *testing.T) {
})
}
}
func TestQueryData_QueryTimeoutConfiguration(t *testing.T) {
tests := []struct {
name string
queryTimeout interface{}
expectedTimeout time.Duration
description string
}{
{
name: "Default timeout when not configured",
queryTimeout: nil,
expectedTimeout: 60 * time.Second,
description: "Should use default 60 seconds when queryTimeout is not set",
},
{
name: "Default timeout when zero",
queryTimeout: 0,
expectedTimeout: 60 * time.Second,
description: "Should use default 60 seconds when queryTimeout is 0",
},
{
name: "Custom timeout configured",
queryTimeout: 30,
expectedTimeout: 30 * time.Second,
description: "Should use configured queryTimeout value",
},
{
name: "Custom timeout as string",
queryTimeout: "45",
expectedTimeout: 45 * time.Second,
description: "Should parse string queryTimeout value",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create datasource settings with queryTimeout
jsonData := map[string]interface{}{
"queryTimeout": tt.queryTimeout,
}
jsonBytes, _ := json.Marshal(jsonData)
dsSettings := backend.DataSourceInstanceSettings{
ID: 1,
Name: "TestDatasource",
URL: "http://zabbix.org/zabbix",
JSONData: jsonBytes,
}
// Parse settings to verify timeout is set correctly
zabbixSettings, err := settings.ReadZabbixSettings(&dsSettings)
assert.NilError(t, err)
assert.Equal(t, tt.expectedTimeout, zabbixSettings.QueryTimeout, tt.description)
})
}
}
func TestQueryData_QueryTimeoutContextCreation(t *testing.T) {
// Test that query timeout context is properly created with the configured timeout
jsonData := map[string]interface{}{
"queryTimeout": 5, // 5 seconds
}
jsonBytes, _ := json.Marshal(jsonData)
dsSettings := backend.DataSourceInstanceSettings{
ID: 1,
Name: "TestDatasource",
URL: "http://zabbix.org/zabbix",
JSONData: jsonBytes,
}
// Verify queryTimeout is set correctly
zabbixSettings, err := settings.ReadZabbixSettings(&dsSettings)
assert.NilError(t, err)
assert.Equal(t, 5*time.Second, zabbixSettings.QueryTimeout)
// Test that context with timeout is created correctly
ctx := context.Background()
queryCtx, cancel := context.WithTimeout(ctx, zabbixSettings.QueryTimeout)
defer cancel()
// Verify context has deadline set
deadline, ok := queryCtx.Deadline()
assert.Assert(t, ok, "Context should have a deadline")
assert.Assert(t, deadline.After(time.Now()), "Deadline should be in the future")
assert.Assert(t, deadline.Before(time.Now().Add(6*time.Second)), "Deadline should be approximately 5 seconds from now")
}
func TestQueryData_QueryTimeoutErrorMessage(t *testing.T) {
// Test that timeout error message contains the expected information
timeoutMsg := "Query execution exceeded maximum allowed time (5s). Query was automatically terminated to prevent excessive resource consumption."
// Verify error message format
assert.Assert(t, strings.Contains(timeoutMsg, "Query execution exceeded maximum allowed time"))
assert.Assert(t, strings.Contains(timeoutMsg, "5s"))
assert.Assert(t, strings.Contains(timeoutMsg, "automatically terminated"))
assert.Assert(t, strings.Contains(timeoutMsg, "prevent excessive resource consumption"))
}

View File

@@ -14,12 +14,13 @@ import (
)
const (
MODE_METRICS = "0"
MODE_ITSERVICE = "1"
MODE_TEXT = "2"
MODE_ITEMID = "3"
MODE_TRIGGERS = "4"
MODE_PROBLEMS = "5"
MODE_METRICS = "0"
MODE_ITSERVICE = "1"
MODE_TEXT = "2"
MODE_ITEMID = "3"
MODE_TRIGGERS = "4"
MODE_PROBLEMS = "5"
MODE_PROBLEMS_ALERTING = "7"
)
type DBConnectionPostProcessingRequest struct {
@@ -127,13 +128,15 @@ func ReadQuery(query backend.DataQuery) (QueryModel, error) {
return model, backend.DownstreamError(fmt.Errorf("could not read query JSON: %w", err))
}
queryType, err := queryJSON.Get("queryType").Int64()
if err != nil {
// Try reading queryType as string first, then as int64
if queryTypeStr, err := queryJSON.Get("queryType").String(); err == nil && queryTypeStr != "" {
model.QueryType = queryTypeStr
} else if queryType, err := queryJSON.Get("queryType").Int64(); err == nil {
model.QueryType = strconv.FormatInt(queryType, 10)
} else {
log.DefaultLogger.Warn("could not read query type", "error", err)
log.DefaultLogger.Debug("setting query type to default value")
model.QueryType = "0"
} else {
model.QueryType = strconv.FormatInt(queryType, 10)
}
}

View File

@@ -0,0 +1,125 @@
package datasource
import (
"context"
"fmt"
"strings"
"time"
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbix"
"github.com/grafana/grafana-plugin-sdk-go/data"
)
func (ds *ZabbixDatasourceInstance) queryProblemsAlerting(ctx context.Context, query *QueryModel) ([]*data.Frame, error) {
ds.logger.Info("queryProblemsAlerting called", "groupFilter", query.Group.Filter, "hostFilter", query.Host.Filter)
triggers, err := ds.zabbix.GetTriggers(ctx, query.Group.Filter, query.Host.Filter)
if err != nil {
ds.logger.Error("GetTriggers failed", "error", err)
return nil, err
}
ds.logger.Info("GetTriggers returned", "count", len(triggers))
if len(triggers) == 0 {
frame := data.NewFrame("No triggers found")
frame.RefID = query.RefID
return []*data.Frame{frame}, nil
}
triggerIDs := make([]string, len(triggers))
for i, t := range triggers {
triggerIDs[i] = t.ID
}
problems, err := ds.zabbix.GetProblems(ctx, triggerIDs)
if err != nil {
return nil, err
}
// Map trigger ID to problem (includes opdata captured at problem creation)
problemMap := buildProblemMap(problems)
currentTime := time.Now()
frames := make([]*data.Frame, 0)
for _, trigger := range triggers {
for _, host := range trigger.Hosts {
value := 0.0
problemName := ""
opdata := ""
if problem, hasProblem := problemMap[trigger.ID]; hasProblem {
value = 1.0
problemName = problem.Name // Expanded trigger description at problem creation
opdata = problem.Opdata // Operational data if configured
}
frame := createAlertingFrame(trigger, host, value, problemName, opdata, currentTime, query.RefID)
frames = append(frames, frame)
}
}
return frames, nil
}
// buildProblemMap returns a map of trigger ID to Problem object
func buildProblemMap(problems []zabbix.Problem) map[string]zabbix.Problem {
problemMap := make(map[string]zabbix.Problem)
for _, p := range problems {
problemMap[p.ObjectID] = p
}
return problemMap
}
func createAlertingFrame(trigger zabbix.Trigger, host zabbix.ItemHost, value float64, problemName string, opdata string, ts time.Time, refID string) *data.Frame {
labels := data.Labels{
"host": host.Name,
"trigger": trigger.Description,
"trigger_id": trigger.ID,
"severity": mapSeverity(trigger.Priority),
"tags": formatTags(trigger.Tags),
"problem_name": problemName, // Expanded trigger description at problem creation
"opdata": opdata, // Operational data if configured on trigger
}
timeField := data.NewField("time", nil, []time.Time{ts})
valueField := data.NewField("value", labels, []float64{value})
frameName := fmt.Sprintf("%s: %s", host.Name, trigger.Description)
frame := data.NewFrame(frameName, timeField, valueField)
frame.RefID = refID
return frame
}
func mapSeverity(priority string) string {
switch priority {
case "0":
return "Not classified"
case "1":
return "Information"
case "2":
return "Warning"
case "3":
return "Average"
case "4":
return "High"
case "5":
return "Disaster"
default:
return priority
}
}
func formatTags(tags []zabbix.Tag) string {
if len(tags) == 0 {
return ""
}
parts := make([]string, len(tags))
for i, t := range tags {
if t.Value != "" {
parts[i] = fmt.Sprintf("%s:%s", t.Tag, t.Value)
} else {
parts[i] = t.Tag
}
}
return strings.Join(parts, ",")
}

View File

@@ -1,13 +1,13 @@
package datasource
import (
"context"
"strings"
"time"
"github.com/alexanderzobnin/grafana-zabbix/pkg/timeseries"
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbix"
"golang.org/x/net/context"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/data"

View File

@@ -9,15 +9,21 @@ const (
// ZabbixDatasourceSettingsDTO model
type ZabbixDatasourceSettingsDTO struct {
AuthType string `json:"authType"`
Trends bool `json:"trends"`
TrendsFrom string `json:"trendsFrom"`
TrendsRange string `json:"trendsRange"`
CacheTTL string `json:"cacheTTL"`
Timeout interface{} `json:"timeout"`
AuthType string `json:"authType"`
Trends bool `json:"trends"`
TrendsFrom string `json:"trendsFrom"`
TrendsRange string `json:"trendsRange"`
CacheTTL string `json:"cacheTTL"`
// Timeout is the HTTP client connection timeout in seconds for individual API requests to Zabbix.
// This controls how long to wait for a single HTTP request/response cycle. Default is 30 seconds.
Timeout interface{} `json:"timeout"`
// QueryTimeout is the maximum execution time in seconds for entire database queries initiated by the plugin.
// This controls the total time allowed for a complete query execution (which may involve multiple API calls).
// Queries exceeding this limit will be automatically terminated. Default is 60 seconds.
QueryTimeout interface{} `json:"queryTimeout"`
DisableDataAlignment bool `json:"disableDataAlignment"`
DisableReadOnlyUsersAck bool `json:"disableReadOnlyUsersAck"`
DisableDataAlignment bool `json:"disableDataAlignment"`
DisableReadOnlyUsersAck bool `json:"disableReadOnlyUsersAck"`
}
// ZabbixDatasourceSettings model
@@ -27,8 +33,14 @@ type ZabbixDatasourceSettings struct {
TrendsFrom time.Duration
TrendsRange time.Duration
CacheTTL time.Duration
Timeout time.Duration
// Timeout is the HTTP client connection timeout for individual API requests to Zabbix.
// This controls how long to wait for a single HTTP request/response cycle. Default is 30 seconds.
Timeout time.Duration
// QueryTimeout is the maximum execution time for entire database queries initiated by the plugin.
// This controls the total time allowed for a complete query execution (which may involve multiple API calls).
// Queries exceeding this limit will be automatically terminated. Default is 60 seconds.
QueryTimeout time.Duration
DisableDataAlignment bool `json:"disableDataAlignment"`
DisableReadOnlyUsersAck bool `json:"disableReadOnlyUsersAck"`
DisableDataAlignment bool `json:"disableDataAlignment"`
DisableReadOnlyUsersAck bool `json:"disableReadOnlyUsersAck"`
}

View File

@@ -11,6 +11,31 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend"
)
// parseTimeoutValue parses a timeout value from various types (string, float64, int64, int)
// and returns it as int64. If the value is empty or invalid, it returns the default value.
// The fieldName parameter is used for error messages.
func parseTimeoutValue(value interface{}, defaultValue int64, fieldName string) (int64, error) {
switch t := value.(type) {
case string:
if t == "" {
return defaultValue, nil
}
timeoutInt, err := strconv.Atoi(t)
if err != nil {
return 0, errors.New("failed to parse " + fieldName + ": " + err.Error())
}
return int64(timeoutInt), nil
case float64:
return int64(t), nil
case int64:
return t, nil
case int:
return int64(t), nil
default:
return defaultValue, nil
}
}
func ReadZabbixSettings(dsInstanceSettings *backend.DataSourceInstanceSettings) (*ZabbixDatasourceSettings, error) {
zabbixSettingsDTO := &ZabbixDatasourceSettingsDTO{}
@@ -33,10 +58,6 @@ func ReadZabbixSettings(dsInstanceSettings *backend.DataSourceInstanceSettings)
zabbixSettingsDTO.CacheTTL = "1h"
}
//if zabbixSettingsDTO.Timeout == 0 {
// zabbixSettingsDTO.Timeout = 30
//}
trendsFrom, err := gtime.ParseInterval(zabbixSettingsDTO.TrendsFrom)
if err != nil {
return nil, err
@@ -52,22 +73,19 @@ func ReadZabbixSettings(dsInstanceSettings *backend.DataSourceInstanceSettings)
return nil, err
}
var timeout int64
switch t := zabbixSettingsDTO.Timeout.(type) {
case string:
if t == "" {
timeout = 30
break
}
timeoutInt, err := strconv.Atoi(t)
if err != nil {
return nil, errors.New("failed to parse timeout: " + err.Error())
}
timeout = int64(timeoutInt)
case float64:
timeout = int64(t)
default:
timeout = 30
timeout, err := parseTimeoutValue(zabbixSettingsDTO.Timeout, 30, "timeout")
if err != nil {
return nil, err
}
queryTimeout, err := parseTimeoutValue(zabbixSettingsDTO.QueryTimeout, 60, "queryTimeout")
if err != nil {
return nil, err
}
// Default to 60 seconds if queryTimeout is 0 or negative
if queryTimeout <= 0 {
queryTimeout = 60
}
zabbixSettings := &ZabbixDatasourceSettings{
@@ -77,6 +95,7 @@ func ReadZabbixSettings(dsInstanceSettings *backend.DataSourceInstanceSettings)
TrendsRange: trendsRange,
CacheTTL: cacheTTL,
Timeout: time.Duration(timeout) * time.Second,
QueryTimeout: time.Duration(queryTimeout) * time.Second,
DisableDataAlignment: zabbixSettingsDTO.DisableDataAlignment,
DisableReadOnlyUsersAck: zabbixSettingsDTO.DisableReadOnlyUsersAck,
}

View File

@@ -0,0 +1,104 @@
package settings
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestParseTimeoutValue(t *testing.T) {
tests := []struct {
name string
value interface{}
defaultValue int64
fieldName string
want int64
wantErr bool
}{
{
name: "valid string",
value: "45",
defaultValue: 30,
fieldName: "timeout",
want: 45,
wantErr: false,
},
{
name: "empty string returns default",
value: "",
defaultValue: 30,
fieldName: "timeout",
want: 30,
wantErr: false,
},
{
name: "invalid string returns error",
value: "not-a-number",
defaultValue: 30,
fieldName: "timeout",
want: 0,
wantErr: true,
},
{
name: "float64 value",
value: float64(60),
defaultValue: 30,
fieldName: "timeout",
want: 60,
wantErr: false,
},
{
name: "int64 value",
value: int64(90),
defaultValue: 30,
fieldName: "timeout",
want: 90,
wantErr: false,
},
{
name: "int value",
value: int(120),
defaultValue: 30,
fieldName: "timeout",
want: 120,
wantErr: false,
},
{
name: "nil returns default",
value: nil,
defaultValue: 30,
fieldName: "timeout",
want: 30,
wantErr: false,
},
{
name: "unknown type returns default",
value: []string{"invalid"},
defaultValue: 60,
fieldName: "queryTimeout",
want: 60,
wantErr: false,
},
{
name: "zero string value",
value: "0",
defaultValue: 30,
fieldName: "timeout",
want: 0,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := parseTimeoutValue(tt.value, tt.defaultValue, tt.fieldName)
if tt.wantErr {
assert.Error(t, err)
assert.Contains(t, err.Error(), tt.fieldName)
} else {
assert.NoError(t, err)
assert.Equal(t, tt.want, got)
}
})
}
}

View File

@@ -5,6 +5,7 @@ import (
"sort"
"strconv"
"strings"
"time"
"github.com/grafana/grafana-plugin-sdk-go/backend"
)
@@ -105,16 +106,24 @@ func (ds *Zabbix) GetItems(
}
if isRegex(itemTagFilter) {
ds.logger.Debug("Processing regex item tag filter", "filterPattern", itemTagFilter, "hostCount", len(hostids))
tags, err := ds.GetItemTags(ctx, groupFilter, hostFilter, itemTagFilter)
if err != nil {
return nil, err
}
ds.logger.Debug("GetItemTags completed", "matchedTagCount", len(tags), "filterPattern", itemTagFilter)
// If regex filter doesn't match any tags, return empty items list
// to prevent silently removing the filter and returning all items
if len(tags) == 0 {
return []*Item{}, nil
}
var tagStrs []string
for _, t := range tags {
tagStrs = append(tagStrs, itemTagToString(t))
}
itemTagFilter = strings.Join(tagStrs, ",")
}
ds.logger.Debug("Fetching items with filters", "hostCount", len(hostids), "itemType", itemType, "showDisabled", showDisabled, "hasItemTagFilter", len(itemTagFilter) > 0)
allItems, err = ds.GetAllItems(ctx, hostids, nil, itemType, showDisabled, itemTagFilter)
if err != nil {
return nil, err
@@ -311,6 +320,10 @@ func (ds *Zabbix) GetHosts(ctx context.Context, groupFilter string, hostFilter s
}
func filterHostsByQuery(items []Host, filter string) ([]Host, error) {
if filter == "" {
return items, nil
}
re, err := parseFilter(filter)
if err != nil {
return nil, err
@@ -346,6 +359,10 @@ func (ds *Zabbix) GetGroups(ctx context.Context, groupFilter string) ([]Group, e
}
func filterGroupsByQuery(items []Group, filter string) ([]Group, error) {
if filter == "" {
return items, nil
}
re, err := parseFilter(filter)
if err != nil {
return nil, err
@@ -549,3 +566,113 @@ func (ds *Zabbix) GetVersion(ctx context.Context) (int, error) {
versionNum, err := strconv.Atoi(version)
return versionNum, err
}
func (ds *Zabbix) GetTriggers(ctx context.Context, groupFilter string, hostFilter string) ([]Trigger, error) {
ds.logger.Info("GetTriggers called", "groupFilter", groupFilter, "hostFilter", hostFilter)
hosts, err := ds.GetHosts(ctx, groupFilter, hostFilter)
if err != nil {
ds.logger.Error("GetHosts failed", "error", err)
return nil, err
}
ds.logger.Info("GetHosts returned", "count", len(hosts))
if len(hosts) == 0 {
return []Trigger{}, nil
}
hostids := make([]string, 0)
for _, host := range hosts {
hostids = append(hostids, host.ID)
}
// Get triggers currently in PROBLEM state (always include these)
problemParams := ZabbixAPIParams{
"output": []string{"triggerid", "description", "priority", "value"},
"hostids": hostids,
"selectHosts": []string{"hostid", "name"},
"selectTags": "extend",
"monitored": true,
"expandDescription": true,
"skipDependent": true, // Only show root cause triggers, not dependent ones
"filter": map[string]interface{}{
"value": "1",
},
}
problemResult, err := ds.Request(ctx, &ZabbixAPIRequest{Method: "trigger.get", Params: problemParams})
if err != nil {
return nil, err
}
var problemTriggers []Trigger
err = convertTo(problemResult, &problemTriggers)
if err != nil {
return nil, err
}
// Get triggers that changed state in the last 24 hours (for alert resolution)
oneDayAgo := time.Now().Add(-24 * time.Hour).Unix()
recentParams := ZabbixAPIParams{
"output": []string{"triggerid", "description", "priority", "value"},
"hostids": hostids,
"selectHosts": []string{"hostid", "name"},
"selectTags": "extend",
"monitored": true,
"expandDescription": true,
"skipDependent": true, // Only show root cause triggers, not dependent ones
"lastChangeSince": oneDayAgo,
}
recentResult, err := ds.Request(ctx, &ZabbixAPIRequest{Method: "trigger.get", Params: recentParams})
if err != nil {
return nil, err
}
var recentTriggers []Trigger
err = convertTo(recentResult, &recentTriggers)
if err != nil {
return nil, err
}
// Merge and deduplicate
triggerMap := make(map[string]Trigger)
for _, t := range problemTriggers {
triggerMap[t.ID] = t
}
for _, t := range recentTriggers {
triggerMap[t.ID] = t
}
triggers := make([]Trigger, 0, len(triggerMap))
for _, t := range triggerMap {
triggers = append(triggers, t)
}
ds.logger.Info("GetTriggers returning", "problemCount", len(problemTriggers), "recentCount", len(recentTriggers), "totalCount", len(triggers))
return triggers, nil
}
func (ds *Zabbix) GetProblems(ctx context.Context, triggerIDs []string) ([]Problem, error) {
if len(triggerIDs) == 0 {
return []Problem{}, nil
}
params := ZabbixAPIParams{
"output": []string{"eventid", "objectid", "severity", "name", "opdata"},
"objectids": triggerIDs,
"source": "0",
"object": "0",
"recent": true,
"selectTags": "extend",
}
result, err := ds.Request(ctx, &ZabbixAPIRequest{Method: "problem.get", Params: params})
if err != nil {
return nil, err
}
var problems []Problem
err = convertTo(result, &problems)
return problems, err
}

View File

@@ -122,6 +122,76 @@ func TestGetItems(t *testing.T) {
}
}
func TestGetItemsWithRegexItemTagFilterNoMatch(t *testing.T) {
// Test that when a regex itemTagFilter doesn't match any tags,
// GetItems returns an empty list instead of all items.
//
// This test verifies the fix for the bug where an empty tag filter result
// would cause itemTagFilter to become empty string, silently removing the filter.
//
// Bug scenario (without fix):
// 1. Regex itemTagFilter "/^NonExistentTag/" doesn't match any tags
// 2. GetItemTags returns empty list
// 3. itemTagFilter becomes "" (empty string)
// 4. GetAllItems is called with empty itemTagFilter → returns ALL items (no tag filtering)
// 5. filterItemsByQuery filters by itemFilter "/.*/" → returns all 2 items
//
// Fixed scenario (with fix):
// 1. Regex itemTagFilter "/^NonExistentTag/" doesn't match any tags
// 2. GetItemTags returns empty list
// 3. Early return with empty items list → returns 0 items
itemGetCalls := []map[string]interface{}{}
client := NewZabbixClientWithHandler(t, func(payload ApiRequestPayload) string {
if payload.Method == "item.get" {
// Track all item.get calls to verify behavior
paramsCopy := make(map[string]interface{})
for k, v := range payload.Params {
paramsCopy[k] = v
}
itemGetCalls = append(itemGetCalls, paramsCopy)
// Return items that would be returned if no tag filter is applied
return `{
"result":[
{"itemid":"100","name":"CPU usage","tags":[{"tag":"Env","value":"prod"}]},
{"itemid":"200","name":"Memory usage","tags":[{"tag":"Application","value":"api"}]}
]
}`
}
if payload.Method == "hostgroup.get" {
return `{"result":[{"groupid":"1","name":"Servers"}]}`
}
if payload.Method == "host.get" {
return `{"result":[{"hostid":"10","name":"web01"}]}`
}
if payload.Method == "apiinfo.version" {
return `{"result":"6.4.0"}`
}
return `{"result":null}`
})
// Use a regex itemTagFilter that won't match any tags
// Use itemFilter "/.*/" which matches all items, so we can detect if bug returns all items
items, err := client.GetItems(context.Background(), "Servers", "web01", "/^NonExistentTag/", "/.*/", "num", false)
require.NoError(t, err)
// With fix: Should return empty list (0 items) because no tags matched
// Without fix: Would return 2 items because itemTagFilter becomes empty and GetAllItems returns all items
if len(items) != 0 {
t.Errorf("Expected empty list when regex itemTagFilter matches no tags, but got %d items. This indicates the bug: itemTagFilter was silently removed and all items were returned.", len(items))
t.Logf("Item.get was called %d times", len(itemGetCalls))
for i, call := range itemGetCalls {
tags, hasTags := call["tags"]
if hasTags {
t.Logf("Call %d: has tags filter: %v", i+1, tags)
} else {
t.Logf("Call %d: NO tags filter (this is the bug - should not call GetAllItems with empty filter)", i+1)
}
}
}
assert.Len(t, items, 0, "Expected empty list when regex itemTagFilter matches no tags. Without fix, this would return 2 items.")
}
func TestGetItemsBefore54(t *testing.T) {
client := NewZabbixClientWithResponses(t, map[string]string{
"hostgroup.get": `{"result":[{"groupid":"1","name":"Servers"}]}`,

View File

@@ -111,3 +111,21 @@ type ValueMapping struct {
Value string `json:"value"`
NewValue string `json:"newvalue"`
}
type Trigger struct {
ID string `json:"triggerid"`
Description string `json:"description"`
Priority string `json:"priority"`
Value string `json:"value"`
Hosts []ItemHost `json:"hosts,omitempty"`
Tags []Tag `json:"tags,omitempty"`
}
type Problem struct {
EventID string `json:"eventid"`
ObjectID string `json:"objectid"`
Severity string `json:"severity"`
Name string `json:"name"`
Opdata string `json:"opdata"`
Tags []Tag `json:"tags,omitempty"`
}

View File

@@ -78,6 +78,7 @@ export const ConfigEditor = (props: Props) => {
trendsRange: '',
cacheTTL: '',
timeout: undefined,
queryTimeout: undefined,
disableDataAlignment: false,
...restJsonData,
},
@@ -238,6 +239,44 @@ export const ConfigEditor = (props: Props) => {
</Field>
</ConfigSubSection>
<ConfigSubSection title="Query Options">
<Field
label={
<Label>
<EditorStack gap={0.5}>
<span>Query Timeout</span>
<Tooltip
content={
<span>
Maximum execution time in seconds for database queries initiated by the plugin. Queries
exceeding this limit will be automatically terminated. Default is 60 seconds.
</span>
}
>
<Icon name="info-circle" size="sm" />
</Tooltip>
</EditorStack>
</Label>
}
>
<Input
width={40}
type="number"
value={options.jsonData.queryTimeout}
placeholder="60"
onChange={(event) => {
onOptionsChange({
...options,
jsonData: {
...options.jsonData,
queryTimeout: parseInt(event.currentTarget.value, 10) || undefined,
},
});
}}
/>
</Field>
</ConfigSubSection>
<ConfigSubSection title="Trends">
<Field label="Enable Trends">
<Switch

View File

@@ -55,6 +55,11 @@ const zabbixQueryTypeOptions: Array<ComboboxOption<QueryType>> = [
label: 'User macros',
description: 'User Macros',
},
{
value: c.MODE_PROBLEMS_ALERTING,
label: 'Problems (Alerting)',
description: 'Query problems for alerting (returns 0/1 time series)',
},
];
const getDefaultQuery: () => Partial<ZabbixMetricsQuery> = () => ({
@@ -226,6 +231,7 @@ export const QueryEditor = ({ query, datasource, onChange, onRunQuery, range }:
{queryType === c.MODE_TEXT && renderTextMetricsEditor()}
{queryType === c.MODE_ITSERVICE && renderITServicesEditor()}
{queryType === c.MODE_PROBLEMS && renderProblemsEditor()}
{queryType === c.MODE_PROBLEMS_ALERTING && renderProblemsEditor()}
{queryType === c.MODE_TRIGGERS && renderTriggersEditor()}
{queryType === c.MODE_MACROS && renderUserMacrosEditor()}
<QueryOptionsEditor queryType={queryType} queryOptions={query.options} onChange={onOptionsChange} />

View File

@@ -0,0 +1,132 @@
import React from 'react';
import { render, waitFor } from '@testing-library/react';
import { ProblemsQueryEditor } from './ProblemsQueryEditor';
import { ShowProblemTypes, ZabbixTagEvalType } from '../../types/query';
const metricPickerSpy = jest.fn();
jest.mock('../../../components', () => ({
MetricPicker: (props: any) => {
metricPickerSpy(props);
return null;
},
}));
jest.mock('@grafana/runtime', () => ({
getTemplateSrv: jest.fn(() => ({
getVariables: jest.fn(() => []),
})),
}));
jest.mock('@grafana/ui', () => ({
Combobox: (props: any) => <div {...props} />,
InlineField: ({ children }: any) => <div>{children}</div>,
InlineFieldRow: ({ children }: any) => <div>{children}</div>,
InlineFormLabel: ({ children }: any) => <div>{children}</div>,
Input: (props: any) => <input {...props} />,
MultiSelect: (props: any) => <div {...props} />,
}));
const baseQuery: any = {
group: { filter: '' },
host: { filter: '' },
proxy: { filter: '' },
application: { filter: '' },
trigger: { filter: '' },
tags: { filter: '' },
evaltype: ZabbixTagEvalType.AndOr,
showProblems: ShowProblemTypes.Problems,
options: { severities: [] },
};
const buildDatasource = (overrides: Partial<any> = {}) => {
const zabbix = {
getAllGroups: jest.fn().mockResolvedValue([]),
getAllHosts: jest.fn().mockResolvedValue([]),
getAllApps: jest.fn().mockResolvedValue([]),
getProxies: jest.fn().mockResolvedValue([]),
supportsApplications: jest.fn(() => true),
...overrides,
};
return {
zabbix,
interpolateVariablesInQueries: jest.fn((queries: any[]) => queries),
};
};
describe('ProblemsQueryEditor', () => {
beforeEach(() => {
metricPickerSpy.mockClear();
});
it('uses proxy name when host is missing', async () => {
const datasource = buildDatasource({
getProxies: jest.fn().mockResolvedValue([{ name: 'proxy-a' }]),
});
render(<ProblemsQueryEditor query={baseQuery} datasource={datasource as any} onChange={jest.fn()} />);
await waitFor(() => {
const proxyCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Proxy name' && props?.options);
expect(proxyCall).toBeTruthy();
expect(proxyCall.options).toEqual([{ value: 'proxy-a', label: 'proxy-a' }]);
});
});
it('uses proxy host when present', async () => {
const datasource = buildDatasource({
getProxies: jest.fn().mockResolvedValue([{ host: 'legacy-proxy' }]),
});
render(<ProblemsQueryEditor query={baseQuery} datasource={datasource as any} onChange={jest.fn()} />);
await waitFor(() => {
const proxyCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Proxy name' && props?.options);
expect(proxyCall).toBeTruthy();
expect(proxyCall.options).toEqual([{ value: 'legacy-proxy', label: 'legacy-proxy' }]);
});
});
it('defaults missing option values to empty strings', async () => {
const datasource = buildDatasource({
getAllGroups: jest.fn().mockResolvedValue([{ name: 'group-a' }, { name: '' }, {}]),
getAllHosts: jest.fn().mockResolvedValue([{ name: 'host-a' }, { name: '' }, {}]),
getAllApps: jest.fn().mockResolvedValue([{ name: 'app-a' }, { name: '' }, {}]),
getProxies: jest.fn().mockResolvedValue([{ name: '' }, { host: '' }, { name: 'proxy-a' }]),
});
render(<ProblemsQueryEditor query={baseQuery} datasource={datasource as any} onChange={jest.fn()} />);
await waitFor(() => {
const groupCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Group name' && props?.options);
const hostCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Host name' && props?.options);
const appCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Application name' && props?.options);
const proxyCall = metricPickerSpy.mock.calls
.map((call) => call[0])
.find((props) => props?.placeholder === 'Proxy name' && props?.options);
const hasValidValues = (options: any[]) =>
options.every(
(option) => option.value !== undefined && (option.label !== undefined || option.value === '/.*/')
);
expect(hasValidValues(groupCall.options)).toBe(true);
expect(hasValidValues(hostCall.options)).toBe(true);
expect(hasValidValues(appCall.options)).toBe(true);
expect(hasValidValues(proxyCall.options)).toBe(true);
});
});
});

View File

@@ -43,8 +43,8 @@ export const ProblemsQueryEditor = ({ query, datasource, onChange }: Props) => {
const loadGroupOptions = async () => {
const groups = await datasource.zabbix.getAllGroups();
const options = groups?.map((group) => ({
value: group.name,
label: group.name,
value: group.name ?? '',
label: group.name ?? '',
}));
options.unshift(...getVariableOptions());
return options;
@@ -58,8 +58,8 @@ export const ProblemsQueryEditor = ({ query, datasource, onChange }: Props) => {
const loadHostOptions = async (group: string) => {
const hosts = await datasource.zabbix.getAllHosts(group);
let options: Array<ComboboxOption<string>> = hosts?.map((host) => ({
value: host.name,
label: host.name,
value: host.name ?? '',
label: host.name ?? '',
}));
options = _.uniqBy(options, (o) => o.value);
options.unshift({ value: '/.*/' });
@@ -75,8 +75,8 @@ export const ProblemsQueryEditor = ({ query, datasource, onChange }: Props) => {
const loadAppOptions = async (group: string, host: string) => {
const apps = await datasource.zabbix.getAllApps(group, host);
let options: Array<ComboboxOption<string>> = apps?.map((app) => ({
value: app.name,
label: app.name,
value: app.name ?? '',
label: app.name ?? '',
}));
options = _.uniqBy(options, (o) => o.value);
options.unshift(...getVariableOptions());
@@ -91,8 +91,8 @@ export const ProblemsQueryEditor = ({ query, datasource, onChange }: Props) => {
const loadProxyOptions = async () => {
const proxies = await datasource.zabbix.getProxies();
const options = proxies?.map((proxy) => ({
value: proxy.host,
label: proxy.host,
value: (!!proxy.host ? proxy.host : proxy.name) ?? '',
label: (!!proxy.host ? proxy.host : proxy.name) ?? '',
}));
options.unshift(...getVariableOptions());
return options;

View File

@@ -51,7 +51,7 @@ export class ZabbixVariableQueryEditor extends PureComponent<VariableQueryProps,
}
getSelectedQueryType(queryType: VariableQueryTypes) {
return this.queryTypes.find((q) => q.value === queryType);
return this.queryTypes.find((q) => q.value === queryType) ?? this.defaults.selectedQueryType;
}
handleQueryUpdate = (evt: React.ChangeEvent<HTMLInputElement>, prop: string) => {

View File

@@ -14,6 +14,7 @@ export const MODE_ITEMID = '3';
export const MODE_TRIGGERS = '4';
export const MODE_PROBLEMS = '5';
export const MODE_MACROS = '6';
export const MODE_PROBLEMS_ALERTING = '7';
// Triggers severity
export const SEV_NOT_CLASSIFIED = 0;

View File

@@ -900,7 +900,7 @@ export class ZabbixDatasource extends DataSourceWithBackend<ZabbixMetricsQuery,
return false;
}
return target.queryType === c.MODE_METRICS || target.queryType === c.MODE_ITEMID;
return target.queryType === c.MODE_METRICS || target.queryType === c.MODE_ITEMID || target.queryType === c.MODE_PROBLEMS_ALERTING;
};
isDBConnectionTarget = (target: any): boolean => {

View File

@@ -14,6 +14,7 @@ export type ZabbixDSOptions = {
trendsRange: string;
cacheTTL: string;
timeout?: number;
queryTimeout?: number;
dbConnectionEnable: boolean;
dbConnectionDatasourceId?: number;
dbConnectionDatasourceName?: string;

View File

@@ -9,7 +9,8 @@ export type QueryType =
| typeof c.MODE_ITEMID
| typeof c.MODE_TRIGGERS
| typeof c.MODE_PROBLEMS
| typeof c.MODE_MACROS;
| typeof c.MODE_MACROS
| typeof c.MODE_PROBLEMS_ALERTING;
type BaseQuery = { queryType: QueryType; datasourceId: number } & DataQuery;

View File

@@ -296,7 +296,6 @@ export class Zabbix implements ZabbixConnector {
}
getAllGroups() {
console.log(this.zabbixAPI.getGroups());
return this.zabbixAPI.getGroups();
}

View File

@@ -0,0 +1,253 @@
import React from 'react';
import { render, screen, within } from '@testing-library/react';
import { ProblemList, ProblemListProps } from './Problems';
import { ProblemDTO, ZBXAlert, ZBXEvent } from '../../../datasource/types';
import { ProblemsPanelOptions, DEFAULT_SEVERITY } from '../../types';
import { APIExecuteScriptResponse, ZBXScript } from '../../../datasource/zabbix/connectors/zabbix_api/types';
// Mock @grafana/runtime
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
reportInteraction: jest.fn(),
config: {},
}));
describe('ProblemList', () => {
const mockGetProblemEvents = jest.fn<Promise<ZBXEvent[]>, [ProblemDTO]>();
const mockGetProblemAlerts = jest.fn<Promise<ZBXAlert[]>, [ProblemDTO]>();
const mockGetScripts = jest.fn<Promise<ZBXScript[]>, [ProblemDTO]>();
const mockOnExecuteScript = jest.fn<Promise<APIExecuteScriptResponse>, [ProblemDTO, string, string]>();
const mockOnProblemAck = jest.fn();
const mockOnTagClick = jest.fn();
const mockOnPageSizeChange = jest.fn();
const mockOnColumnResize = jest.fn();
const defaultPanelOptions: ProblemsPanelOptions = {
datasources: [],
fontSize: '100%',
layout: 'table',
schemaVersion: 1,
targets: [],
hostField: true,
hostTechNameField: false,
hostGroups: false,
hostProxy: false,
severityField: true,
statusField: true,
statusIcon: true,
opdataField: false,
ackField: true,
showTags: true,
showDatasourceName: false,
ageField: true,
customLastChangeFormat: false,
lastChangeFormat: '',
highlightNewEvents: false,
highlightNewerThan: '',
markAckEvents: false,
ackEventColor: 'rgb(56, 219, 156)',
okEventColor: 'rgb(56, 189, 113)',
triggerSeverity: DEFAULT_SEVERITY,
problemTimeline: false,
allowDangerousHTML: false,
resizedColumns: [],
};
const createMockProblem = (id: string, timestamp: number): ProblemDTO => ({
eventid: id,
name: `Test Problem ${id}`,
acknowledged: '0',
value: '1',
severity: '3',
priority: '3',
host: `Test Host ${id}`,
hostTechName: `host-${id}`,
hostInMaintenance: false,
groups: [],
proxy: '',
tags: [],
url: '',
opdata: '',
datasource: { type: 'alexanderzobnin-zabbix-datasource', uid: 'test-ds' },
timestamp,
acknowledges: [],
suppressed: '0',
suppression_data: [],
comments: '',
});
const defaultProps: ProblemListProps = {
problems: [],
panelOptions: defaultPanelOptions,
loading: false,
pageSize: 10,
fontSize: 100,
panelId: 1,
getProblemEvents: mockGetProblemEvents,
getProblemAlerts: mockGetProblemAlerts,
getScripts: mockGetScripts,
onExecuteScript: mockOnExecuteScript,
onProblemAck: mockOnProblemAck,
onTagClick: mockOnTagClick,
onPageSizeChange: mockOnPageSizeChange,
onColumnResize: mockOnColumnResize,
};
beforeEach(() => {
jest.clearAllMocks();
});
describe('Age Field', () => {
it('should render the age column header when ageField is enabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, ageField: true },
problems: [createMockProblem('1', 1609459200)], // 2021-01-01 00:00:00 UTC
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const ageHeader = headers.find((header) => header.textContent === 'Age');
expect(ageHeader).toBeInTheDocument();
});
it('should not render the age column header when ageField is disabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, ageField: false },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const ageHeader = headers.find((header) => header.textContent === 'Age');
expect(ageHeader).toBeUndefined();
});
});
describe('Status Field', () => {
it('should render the status column header when statusField is enabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, statusField: true },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const statusHeader = headers.find((header) => header.textContent === 'Status');
expect(statusHeader).toBeInTheDocument();
});
it('should not render the status column header when statusField is disabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, statusField: false },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const statusHeader = headers.find((header) => header.textContent === 'Status');
expect(statusHeader).toBeUndefined();
});
});
describe('Severity Field', () => {
it('should render the severity column header when severityField is enabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, severityField: true },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const severityHeader = headers.find((header) => header.textContent === 'Severity');
expect(severityHeader).toBeInTheDocument();
});
it('should not render the severity column header when severityField is disabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, severityField: false },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const severityHeader = headers.find((header) => header.textContent === 'Severity');
expect(severityHeader).toBeUndefined();
});
});
describe('Ack Field', () => {
it('should render the ack column header when ackField is enabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, ackField: true },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const ackHeader = headers.find((header) => header.textContent === 'Ack');
expect(ackHeader).toBeInTheDocument();
});
it('should not render the ack column header when ackField is disabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, ackField: false },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const ackHeader = headers.find((header) => header.textContent === 'Ack');
expect(ackHeader).toBeUndefined();
});
});
describe('Datasource Field', () => {
it('should not render the datasource column header when showDatasourceName is disabled', () => {
const props = {
...defaultProps,
panelOptions: { ...defaultPanelOptions, showDatasourceName: false },
problems: [createMockProblem('1', 1609459200)],
};
render(<ProblemList {...props} />);
const table = screen.getByRole('table');
const headers = within(table).getAllByRole('columnheader');
const datasourceHeader = headers.find((header) => header.textContent === 'Datasource');
expect(datasourceHeader).toBeUndefined();
});
});
});

View File

@@ -23,8 +23,9 @@ import {
getPaginationRowModel,
useReactTable,
} from '@tanstack/react-table';
import { reportInteraction } from '@grafana/runtime';
import { getDataSourceSrv, reportInteraction } from '@grafana/runtime';
import { ProblemDetails } from './ProblemDetails';
import { capitalizeFirstLetter, parseCustomTagColumns } from './utils';
export interface ProblemListProps {
problems: ProblemDTO[];
@@ -47,6 +48,33 @@ export interface ProblemListProps {
const columnHelper = createColumnHelper<ProblemDTO>();
const buildCustomTagColumns = (customTagColumns?: string) => {
const tagNames = parseCustomTagColumns(customTagColumns);
return tagNames.map((tagName) =>
columnHelper.accessor(
(row) => {
const tags = row.tags ?? [];
const values = tags
.filter((t) => t.tag === tagName)
.map((t) => t.value)
.filter(Boolean);
return values.length ? values.join(', ') : '';
},
{
id: `problem-tag_${tagName}`,
header: capitalizeFirstLetter(tagName),
size: 150,
meta: {
className: `problem-tag_${tagName}`,
},
cell: ({ getValue }) => <span>{getValue() as string}</span>,
}
)
);
};
export const ProblemList = (props: ProblemListProps) => {
const {
pageSize,
@@ -72,6 +100,8 @@ export const ProblemList = (props: ProblemListProps) => {
const columns = useMemo(() => {
const highlightNewerThan = panelOptions.highlightNewEvents && panelOptions.highlightNewerThan;
const customTagColumns = buildCustomTagColumns(panelOptions.customTagColumns);
return [
columnHelper.accessor('host', {
header: 'Host',
@@ -146,6 +176,7 @@ export const ProblemList = (props: ProblemListProps) => {
size: 70,
cell: ({ cell }) => <AckCell acknowledges={cell.row.original.acknowledges} />,
}),
...customTagColumns,
columnHelper.accessor('tags', {
header: 'Tags',
size: 150,
@@ -160,6 +191,19 @@ export const ProblemList = (props: ProblemListProps) => {
/>
),
}),
columnHelper.accessor('datasource', {
header: 'Datasource',
size: 120,
cell: ({ cell }) => {
const datasource = cell.getValue();
let dsName: string = datasource as string;
if ((datasource as DataSourceRef)?.uid) {
const dsInstance = getDataSourceSrv().getInstanceSettings((datasource as DataSourceRef).uid);
dsName = dsInstance?.name || dsName;
}
return <span>{dsName}</span>;
},
}),
columnHelper.accessor('timestamp', {
id: 'age',
header: 'Age',
@@ -167,7 +211,7 @@ export const ProblemList = (props: ProblemListProps) => {
meta: {
className: 'problem-age',
},
cell: ({ cell }) => moment.unix(cell.row.original.timestamp),
cell: ({ cell }) => <span>{moment.unix(cell.row.original.timestamp).fromNow(true)}</span>,
}),
columnHelper.accessor('timestamp', {
id: 'lastchange',
@@ -237,6 +281,27 @@ export const ProblemList = (props: ProblemListProps) => {
}));
}, [effectivePageSize]);
// Column visibility state derived from panelOptions
const columnVisibility = useMemo(
() => ({
host: panelOptions.hostField,
hostTechName: panelOptions.hostTechNameField,
groups: panelOptions.hostGroups,
proxy: panelOptions.hostProxy,
priority: panelOptions.severityField,
statusIcon: panelOptions.statusIcon,
value: panelOptions.statusField,
opdata: panelOptions.opdataField,
acknowledged: panelOptions.ackField,
tags: panelOptions.showTags,
datasource: panelOptions.showDatasourceName,
age: panelOptions.ageField,
}),
[panelOptions]
);
// https://github.com/TanStack/table/issues/6137
// eslint-disable-next-line react-hooks/incompatible-library -- TanStack Table's useReactTable returns functions that cannot be memoized
const table = useReactTable({
data: problems,
columns,
@@ -245,25 +310,12 @@ export const ProblemList = (props: ProblemListProps) => {
state: {
columnSizing,
pagination,
columnVisibility,
},
onPaginationChange: setPagination,
meta: {
panelOptions,
},
initialState: {
columnVisibility: {
host: panelOptions.hostField,
hostTechName: panelOptions.hostTechNameField,
groups: panelOptions.hostGroups,
proxy: panelOptions.hostProxy,
severity: panelOptions.severityField,
statusIcon: panelOptions.statusIcon,
opdata: panelOptions.opdataField,
ack: panelOptions.ackField,
tags: panelOptions.showTags,
age: panelOptions.ageField,
},
},
onColumnSizingChange: (updater) => {
const newSizing = typeof updater === 'function' ? updater(columnSizing) : updater;
setColumnSizing(newSizing);

View File

@@ -0,0 +1,38 @@
import { capitalizeFirstLetter, parseCustomTagColumns } from './utils';
describe('capitalizeFirstLetter', () => {
it('capitalizes first letter and lowercases the rest', () => {
expect(capitalizeFirstLetter('zabbixgrafana')).toBe('Zabbixgrafana');
expect(capitalizeFirstLetter('ZABBIXGRAFANA')).toBe('Zabbixgrafana');
expect(capitalizeFirstLetter('zAbBiXgRaFaNa')).toBe('Zabbixgrafana');
});
it('returns empty string for empty input', () => {
expect(capitalizeFirstLetter('')).toBe('');
});
it('handles single-character strings', () => {
expect(capitalizeFirstLetter('a')).toBe('A');
expect(capitalizeFirstLetter('A')).toBe('A');
});
});
describe('parseCustomTagColumns', () => {
it('returns empty array for undefined or empty input', () => {
expect(parseCustomTagColumns(undefined)).toEqual([]);
expect(parseCustomTagColumns('')).toEqual([]);
expect(parseCustomTagColumns(' ')).toEqual([]);
});
it('splits comma-separated values and trims whitespace', () => {
expect(parseCustomTagColumns('env, region ,service')).toEqual(['env', 'region', 'service']);
});
it('filters out empty values', () => {
expect(parseCustomTagColumns('env,, ,region,')).toEqual(['env', 'region']);
});
it('preserves order', () => {
expect(parseCustomTagColumns('a,b,c')).toEqual(['a', 'b', 'c']);
});
});

View File

@@ -0,0 +1,12 @@
export const capitalizeFirstLetter = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
export const parseCustomTagColumns = (customTagColumns?: string): string[] => {
if (!customTagColumns) {
return [];
}
return customTagColumns
.split(',')
.map((tagName) => tagName.trim())
.filter(Boolean);
};

View File

@@ -220,6 +220,17 @@ export const plugin = new PanelPlugin<ProblemsPanelOptions, {}>(ProblemsPanel)
name: 'Datasource name',
defaultValue: defaultPanelOptions.showDatasourceName,
category: ['Fields'],
})
// Select tag name to display as column
.addTextInput({
path: 'customTagColumns',
name: 'Tags to columns',
defaultValue: '',
description: 'Comma-separated list of tag names to display as columns (e.g., component, scope, environment)',
settings: {
placeholder: 'component, scope, target',
},
category: ['Fields'],
});
});

View File

@@ -42,6 +42,8 @@ export interface ProblemsPanelOptions {
okEventColor: TriggerColor;
ackEventColor: TriggerColor;
markAckEvents?: boolean;
// Custom tag names to display as column
customTagColumns?: string;
}
export const DEFAULT_SEVERITY: TriggerSeverity[] = [

976
yarn.lock

File diff suppressed because it is too large Load Diff