Skip to content

Commit 8a782ab

Browse files
authored
Merge branch 'master' into rob-944-channel-override
2 parents cf9576f + 808d455 commit 8a782ab

9 files changed

Lines changed: 69 additions & 7 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ skaffold.dev.yaml
2121
tests/last_used_tag.txt
2222
pytest.ini
2323
gen-config-test
24+
25+
**/.claude/settings.local.json

docs/configuration/alertmanager-integration/_pull_integration.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ If Robusta fails to auto-detect the Prometheus and Alertmanager urls - and you s
2424
# prometheus_auth: ...
2525
# alertmanager_auth: ...
2626
27+
# If using a multi-tenant prometheus or alertmanager, pass the org id to all queries
28+
# prometheus_additional_headers:
29+
# X-Scope-OrgID: <org id>
30+
# alertmanager_additional_headers:
31+
# X-Scope-OrgID: <org id>
32+
2733
.. code-annotations::
2834
1. Example: http://alertmanager-Helm_release_name-kube-prometheus-alertmanager.default.svc.cluster.local:9093.
2935
2. Example: http://Helm_Release_Name-kube-prometheus-prometheus.default.svc.cluster.local:9090

docs/configuration/alertmanager-integration/coralogix_managed_prometheus.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ Metrics querying lets Robusta pull metrics from Coralogix Managed Prometheus.
8282
# grafana_api_key: <YOUR GRAFANA EDITOR API KEY> # (1)
8383
# alertmanager_flavor: grafana
8484
85+
# If using a multi-tenant prometheus or alertmanager, pass the org id to all queries
86+
# prometheus_additional_headers:
87+
# X-Scope-OrgID: <org id>
88+
# alertmanager_additional_headers:
89+
# X-Scope-OrgID: <org id>
90+
8591
.. code-annotations::
8692
1. This is necessary for Robusta to create silences when using Grafana Alerts, because of minor API differences in the AlertManager embedded in Grafana.
8793

docs/configuration/alertmanager-integration/grafana-alert-manager.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ Modify and add the following config to ``generated_values.yaml`` and :ref:`updat
8383
# prometheus_additional_labels:
8484
# cluster: 'CLUSTER_NAME_HERE'
8585
86+
# If using a multi-tenant prometheus or alertmanager, pass the org id to all queries
87+
# prometheus_additional_headers:
88+
# X-Scope-OrgID: <org id>
89+
# alertmanager_additional_headers:
90+
# X-Scope-OrgID: <org id>
91+
8692
.. code-annotations::
8793
1. This is necessary for Robusta to create silences when using Grafana Alerts, because of minor API differences in the AlertManager embedded in Grafana.
8894

docs/configuration/alertmanager-integration/victoria-metrics.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ Add the following to ``generated_values.yaml`` and :ref:`update Robusta <Simple
3939
# grafana_api_key: <YOUR GRAFANA EDITOR API KEY> # (1)
4040
# alertmanager_flavor: grafana
4141
42+
# If using a multi-tenant prometheus or alertmanager, pass the org id to all queries
43+
# prometheus_additional_headers:
44+
# X-Scope-OrgID: <org id>
45+
# alertmanager_additional_headers:
46+
# X-Scope-OrgID: <org id>
47+
4248
.. code-annotations::
4349
1. This is necessary for Robusta to create silences when using Grafana Alerts, because of minor API differences in the AlertManager embedded in Grafana.
4450

playbooks/robusta_playbooks/krr.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,14 @@ class KRRSecret(BaseModel):
178178
secret_value: str
179179
command_flag: str
180180

181-
def __init__(self, env_var_name: str, secret_key: str, secret_value: str, command_flag: str):
182-
secret_b64_str = base64.b64encode(bytes(secret_value, "utf-8")).decode("utf-8")
183-
super().__init__(
184-
env_var_name=env_var_name, secret_key=secret_key, secret_value=secret_b64_str, command_flag=command_flag
185-
)
181+
@validator('secret_value', pre=True, always=True, allow_reuse=True)
182+
def encode_secret_value(cls, v: str) -> str:
183+
if isinstance(v, str):
184+
return base64.b64encode(bytes(v, "utf-8")).decode("utf-8")
185+
raise ValueError("secret_value must be a string")
186+
187+
class KRRSecretKeyValuePair(KRRSecret):
188+
arg_key: str
186189

187190

188191
def _generate_krr_job_secret(scan_id: str, krr_secrets: Optional[List[KRRSecret]]) -> Optional[JobSecret]:
@@ -210,7 +213,14 @@ def _generate_krr_env_vars(
210213
def _generate_additional_env_args(krr_secrets: Optional[List[KRRSecret]]) -> str:
211214
if not krr_secrets:
212215
return ""
213-
return " ".join(f"{secret.command_flag} '$({secret.env_var_name})'" for secret in krr_secrets)
216+
additional_args = []
217+
for secret in krr_secrets:
218+
if isinstance(secret, KRRSecretKeyValuePair):
219+
additional_args.append(f"{secret.command_flag} '{secret.arg_key}:$({secret.env_var_name})'")
220+
else:
221+
additional_args.append(f"{secret.command_flag} '$({secret.env_var_name})'")
222+
223+
return " ".join(additional_args)
214224

215225

216226
def _generate_cmd_line_args(prom_config: PrometheusConfig) -> str:
@@ -240,6 +250,22 @@ def _generate_prometheus_secrets(prom_config: PrometheusConfig) -> List[KRRSecre
240250
command_flag="--prometheus-auth-header",
241251
)
242252
)
253+
254+
if prom_config.headers:
255+
for header_name, header_value in prom_config.headers.items():
256+
257+
env_var_name = f"PROMETHEUS_HEADER_{header_name.upper().replace('-', '_')}"
258+
secret_key = f"prometheus-header-{header_name.lower()}"
259+
260+
krr_secrets.append(
261+
KRRSecretKeyValuePair(
262+
env_var_name=env_var_name,
263+
arg_key=header_name,
264+
secret_key=secret_key,
265+
secret_value=header_value,
266+
command_flag="--prometheus-headers",
267+
)
268+
)
243269

244270
if isinstance(prom_config, AWSPrometheusConfig):
245271
krr_secrets.extend(

src/robusta/core/model/base_params.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ class PrometheusParams(ActionParams):
315315
:var prometheus_url: Prometheus url. If omitted, we will try to find a prometheus instance in the same cluster
316316
:var prometheus_auth: Prometheus auth header to be used in Authorization header. If omitted, we will not add any auth header
317317
:var prometheus_url_query_string: Additional query string parameters to be appended to the Prometheus connection URL
318+
:var prometheus_additional_headers: additional HTTP headers (if defined) to add to every prometheus query
318319
:var prometheus_additional_labels: A dictionary of additional labels needed for multi-cluster prometheus
319320
:var add_additional_labels: adds the additional labels (if defined) to the query
320321
@@ -330,6 +331,7 @@ class PrometheusParams(ActionParams):
330331
prometheus_url: Optional[str] = None
331332
prometheus_auth: Optional[SecretStr] = None
332333
prometheus_url_query_string: Optional[str] = None
334+
prometheus_additional_headers: Optional[Dict[str, str]] = None
333335
prometheus_additional_labels: Optional[Dict[str, str]] = None
334336
add_additional_labels: bool = True
335337
prometheus_graphs_overrides: Optional[List[OverrideGraph]] = None

src/robusta/integrations/prometheus/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ def generate_prometheus_config(prometheus_params: PrometheusParams) -> Prometheu
4848
"url": url,
4949
"disable_ssl": not PROMETHEUS_SSL_ENABLED,
5050
"additional_labels": prometheus_params.prometheus_additional_labels,
51-
"prometheus_url_query_string": prometheus_params.prometheus_url_query_string,
51+
"prometheus_url_query_string": prometheus_params.prometheus_url_query_string
5252
}
5353
if prometheus_params.prometheus_auth:
5454
baseconfig["prometheus_auth"] = prometheus_params.prometheus_auth.get_secret_value()
55+
56+
if prometheus_params.prometheus_additional_headers:
57+
baseconfig["headers"] = prometheus_params.prometheus_additional_headers
5558

5659
# aws config
5760
if AWS_ACCESS_KEY:

src/robusta/utils/silence_utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ def to_list(self) -> List[str]:
5656
class AlertManagerParams(ActionParams):
5757
"""
5858
:var alertmanager_url: Alternative Alert Manager url to send requests.
59+
:var alertmanager_additional_headers: additional HTTP headers (if defined) to add to every alertmanager request
5960
"""
6061

6162
alertmanager_flavor: str = None # type: ignore
6263
alertmanager_url: Optional[str]
6364
alertmanager_auth: Optional[SecretStr] = None
65+
alertmanager_additional_headers: Optional[Dict[str, str]] = None
6466
grafana_api_key: str = None # type: ignore
6567

6668
@validator("alertmanager_url", allow_reuse=True)
@@ -143,6 +145,9 @@ def gen_alertmanager_headers(params: AlertManagerParams) -> Dict:
143145

144146
elif params.alertmanager_auth:
145147
headers.update({"Authorization": params.alertmanager_auth.get_secret_value()})
148+
149+
if params.alertmanager_additional_headers:
150+
headers.update(params.alertmanager_additional_headers)
146151

147152
return headers
148153

0 commit comments

Comments
 (0)