Patch Prometheus Operator `externalUrl`
I continue to learn “tricks” with Prometheus and (kube-prometheus ⊃ Prometheus Operator).
For too long, I’ve lived with Alertmanager alerts including “View in Alertmanager” and “Source” hyperlinks that don’t work because they defaulted incorrectly.
The solution when running either Prometheus or Alertmanager (same for both) is to use the flag:
--web.external-url="${EXTERNAL_URL}"
Conveniently, when running kube-prometheus, there are Prometheus and Alertmanager CRDs for configuring Prometheus and Alertmanager and these include the field:
externalUrl: "${EXTERNAL_URL}"
The question is: How to configure this value?
There’s probably a way to configure this value during installation but, I’m currently patching the existing resources.
kubectl provides 3 patch mechanisms (json,merge,strategic).
In my installation, I have one Prometheus Resource and one Alertmanager Resource:
NAMESPACE="observability"
kubectl get prometheus \
--namespace=${NAMESPACE} \
--output=name
kubectl get alertmanager \
--namespace=${NAMESPACE} \
--output=name
prometheus.monitoring.coreos.com/kube-prom-stack-kube-prome-prometheus
alertmanager.monitoring.coreos.com/kube-prom-stack-kube-prome-alertmanager
And extracting the current externalUrl:
FILTER="{.spec.externalUrl}"
kubectl get prometheus/kube-prom-stack-kube-prome-prometheus \
--namespace=${NAMESPACE} \
--output=jsonpath="${FILTER}"
kubectl get alertmanager/kube-prom-stack-kube-prome-alertmanager \
--namespace=${NAMESPACE} \
--output=jsonpath="${FILTER}"
http://kube-prom-stack-kube-prome-prometheus.observability:9090
http://kube-prom-stack-kube-prome-alertmanager.observability:9093
Let’s merge:
DOMAIN="..."
TYPE="merge"
HOST="prometheus"
ENDPOINT="https://${HOST}.${DOMAIN}"
PATCH="
{
\"spec\": {
\"externalUrl\": \"${ENDPOINT}\"
}
}"
# Patch Prometheus (name: `-prometheus`)
kubectl patch prometheus/kube-prom-stack-kube-prome-prometheus \
--namespace=${NAMESPACE} \
--type="${TYPE}" \
--patch="${PATCH}"
HOST="alertmanager"
ENDPOINT="https://${HOST}.${DOMAIN}"
PATCH="
{
\"spec\": {
\"externalUrl\": \"${ENDPOINT}\"
}
}"
# Patch Alertmanager (name: `-alertmanager`)
kubectl patch alertmanager/kube-prom-stack-kube-prome-alertmanager \
--namespace=${NAMESPACE} \
--type="${TYPE}" \
--patch="${PATCH}"
Or, we can json:
DOMAIN="..."
TYPE="json"
HOST="prometheus"
ENDPOINT="https://${HOST}.${DOMAIN}"
PATCH="
[
{
\"op\": \"replace\",
\"path\": \"/spec/externalUrl\",
\"value\": \"${ENDPOINT}\"
}
]"
# Patch Prometheus (name: `-prometheus`)
kubectl patch prometheus/kube-prom-stack-kube-prome-prometheus \
--namespace=${NAMESPACE} \
--type="${TYPE}" \
--patch="${PATCH}"
HOST="alertmanager"
ENDPOINT="https://${HOST}.${DOMAIN}"
PATCH="
[
{
\"op\": \"replace\",
\"path\": \"/spec/externalUrl\",
\"value\": \"${ENDPOINT}\"
}
]"
# Patch Alertmanager (name: `-alertmanager`)
kubectl patch alertmanager/kube-prom-stack-kube-prome-alertmanager \
--namespace=${NAMESPACE} \
--type="${TYPE}" \
--patch="${PATCH}"
That’s all!