Skip to content

fix(jira): prevent hostname corruption in Cloud API URL replacement#4892

Merged
SuperQ merged 1 commit intoprometheus:mainfrom
alex-deploys:fix-jira-cloud-url-replacement
Jan 28, 2026
Merged

fix(jira): prevent hostname corruption in Cloud API URL replacement#4892
SuperQ merged 1 commit intoprometheus:mainfrom
alex-deploys:fix-jira-cloud-url-replacement

Conversation

@alex-deploys
Copy link
Contributor

Description

This PR fixes a bug in the Jira Cloud integration where hostnames containing the digit '2' were incorrectly modified during API version replacement, resulting in 404 errors when attempting to create or search for issues.

Problem

The current implementation uses strings.Replace(url, "/2", "/3", 1) to upgrade the API version from v2 to v3. However, this replaces the first occurrence of /2 in the entire URL string.

When a Jira Cloud instance has a hostname containing the digit '2' (e.g., example2.atlassian.net), the replacement incorrectly modifies the hostname to example3.atlassian.net, causing 404 errors.

Example:

  • Input: https://example2.atlassian.net/rest/api/2/search/jql
  • Current behavior: https://example3.atlassian.net/rest/api/2/search/jql
  • Expected behavior: https://example2.atlassian.net/rest/api/3/search/jql

Solution

Changed the replacement pattern from /2 to the more specific /rest/api/2/, ensuring only the API version in the path is modified and not characters in the hostname.

Testing

  • Tested with a Jira Cloud instance at acme2corp.atlassian.net
  • Previously failed with 404 errors when searching for existing issues
  • After fix: successfully creates and searches for Jira issues

Related

This addresses the Jira Cloud endpoint migration mentioned in the code comments, where /rest/api/2/search was deprecated in favor of /rest/api/3/search/jql (see https://developer.atlassian.com/changelog/#CHANGE-2046).

The previous implementation used strings.Replace to change '/2' to '/3'
in the API URL path, but this incorrectly matched and replaced the '2'
in hostnames containing that character (e.g., 'example2.atlassian.net'),
resulting in malformed URLs like 'https://example3.atlassian.net/...'.

This fix makes the replacement more specific by targeting the full
'/rest/api/2/' path instead of just '/2', ensuring only the API version
in the path is modified, not characters in the hostname.

Signed-off-by: alex-deploys <alex-deploys@users.noreply.github.com>
@alex-deploys
Copy link
Contributor Author

Pinging @SoloJacobs @holger-waschke @tjhop because they were active on this file. Can you please check this?

@holger-waschke
Copy link
Contributor

seems like a reasonable fix to me

@alex-deploys
Copy link
Contributor Author

@holger-waschke thank you

I’m also linking this issue that I had when receiving the 404 errors and didn’t know why it was

#4609

@TheMeier
Copy link
Contributor

I think this warrants some tests.

@SoloJacobs SoloJacobs self-requested a review January 18, 2026 21:46
Copy link
Contributor

@SoloJacobs SoloJacobs left a comment

Choose a reason for hiding this comment

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

Hi @alex-deploys ,

this was already mentioned, but could you add a test for your fix. Thank you !

Moreover, I'm wondering whether the string replace method was the correct approach in the first place. Did you consider whether the code here could simplified?

Kind regards

@SuperQ
Copy link
Member

SuperQ commented Jan 28, 2026

Still seems fragile that it doesn't act only on the non-hostname part. But it's an improvement.

@SuperQ SuperQ merged commit ec88c5b into prometheus:main Jan 28, 2026
7 checks passed
@SoloJacobs SoloJacobs mentioned this pull request Jan 29, 2026
SuperQ added a commit that referenced this pull request Feb 2, 2026
* [ENHANCEMENT] docs(opsgenie): Fix description of `api_url` field. #4908
* [ENHANCEMENT] docs(slack): Document missing app configs. #4871
* [ENHANCEMENT] docs: Fix `max-silence-size-bytes`. #4805
* [ENHANCEMENT] docs: Update expr for `AlertmanagerClusterFailedToSendAlerts` to exclude value 0. #4872
* [ENHANCEMENT] docs: Use matchers for inhibit rules examples. #4131
* [ENHANCEMENT] docs: add notification integrations. #4901
* [ENHANCEMENT] docs: update `slack_config` attachments documentation links. #4802
* [ENHANCEMENT] docs: update description of filter query params in openapi doc. #4810
* [ENHANCEMENT] provider: Reduce lock contention. #4809
* [FEATURE] slack: Add support for top-level text field in slack notification. #4867
* [FEATURE] smtp: Add support for authsecret from file. #3087
* [FEATURE] smtp: Customize the ssl/tls port support (#4757). #4818
* [FEATURE] smtp: Enhance email notifier configuration validation. #4826
* [FEATURE] telegram: Add `chat_id_file` configuration parameter. #4909
* [FEATURE] telegram: Support global bot token. #4823
* [FEATURE] webhook: Support templating in url fields. #4798
* [FEATURE] wechat: Add config directive to pass api secret via file. #4734
* [FEATURE] provider: Implement per alert limits. #4819
* [BUGFIX] Allow empty `group_by` to override parent route. #4825
* [BUGFIX] Set `spellcheck=false` attribute on silence filter input. #4811
* [BUGFIX] jira: Fix for handling api v3 with ADF. #4756
* [BUGFIX] jira: Prevent hostname corruption in cloud api url replacement. #4892
---------

Signed-off-by: Solomon Jacobs <solomonjacobs@protonmail.com>
Signed-off-by: Ben Kochie <superq@gmail.com>
Co-authored-by: Ben Kochie <superq@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants