[Bug] Build id mismatch between controller and self-hosted server
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- go, kubernetes, prometheus
- Lĩnh vực
- backend, observability
Hướng nghiên cứu
Start with the HPA generation path that injects the build ID and deployment name into metric selectors, then trace how those values are produced and compared with self-hosted Temporal server metrics. The report names examples/wrt-hpa-backlog.yaml as the reproduction; run it against a self-hosted server and inspect the generated HPA selectors alongside the backlog metric labels. Done means the selectors can match those labels and the backlog metric no longer fails, allowing scale-down.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
What are you really trying to do?
Scale each worker version on its task backlog with a self-hosted Temporal server, following Phase 2 of the HPA demo (examples/wrt-hpa-backlog.yaml). The demo uses temporal_cloud_v1_approximate_backlog_count; the self-hosted counterpart is approximate_backlog_count.
Describe the bug
The build ID the controller puts in each HPA's External metric selector can never match the build ID label on the server's backlog metrics.
The controller injects the raw build ID into the selector, and auto-generated build IDs always contain a - (<image tag>-<pod template hash>, see ComputeBuildID). The self-hosted server's default Prometheus reporter replaces every character outside [A-Za-z0-9_] in label values with _. For the same worker version:
| Source | Value |
|---|---|
HPA selector (temporal_worker_build_id) |
service-e86a427173154a90-db48 |
Server metric (worker_build_id) |
service_e86a427173154a90_db48 |
The label names differ too (worker_build_id vs temporal_worker_build_id). A recording rule can rename those, but PromQL has no global string replace, so the values can't be mapped back.
Deployment names have the same problem whenever a WorkerDeployment's name contains - or .. The controller's label replaces only the / in <namespace>/<name>, while the server replaces all three characters.
As a result, the HPA reports <unknown> for the backlog metric with FailedGetExternalMetric. Since one of its metrics is failing, it also never scales down.
Minimal Reproduction
The demo's helloworld worker reproduces this without changes, run against a self-hosted server instead of Temporal Cloud:
- Install the Temporal Helm chart with the server's Prometheus metrics scraped (e.g.
server.metrics.serviceMonitor.enabled: true). - Deploy the helloworld WorkerDeployment and generate some load.
- Query the server's per-version backlog:
group by (worker_deployment_name, worker_build_id) (approximate_backlog_count{worker_deployment_name!=""}) - Apply a WorkerResourceTemplate with an External metric on that series (renamed by a recording rule if you like), then compare the injected selector:
kubectl get hpa -o jsonpath='{range .items[*]}{.spec.metrics[*].external.metric.selector.matchLabels}{"\n"}{end}'
The build IDs differ only in - vs _.
Environment/Versions
- OS and processor: Linux x86_64
- temporal-worker-controller v1.14.0 (chart 0.33.0)
- Temporal Server 1.32.2 (Helm chart 1.8.0)
- Kubernetes v1.37.0 on kind, with kube-prometheus-stack and prometheus-adapter
Additional context
My agent came up with this workaround: allow - and . in label values through the server's Prometheus sanitizeOptions. After that, the server's labels match the controller's values exactly:
global:
metrics:
prometheus:
sanitizeOptions:
nameChars: &alphanumericUnderscore
ranges: &alphanumeric
- { startRange: "a", endRange: "z" }
- { startRange: "A", endRange: "Z" }
- { startRange: "0", endRange: "9" }
safeChars: "_"
keyChars: *alphanumericUnderscore
valueChars:
ranges: *alphanumeric
safeChars: "_-."
replacementChar: "_"
But sanitizeOptions is marked deprecated and it changes label values on every server metric, so that doesn't seem great.
- Ngôn ngữ chính
- Go
- Star
- 199
- Fork
- 85
- Merge trung bình
- 2 ngày 15 giờ
- Pull request đã merge (30 ngày)
- 33
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Không có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của temporalio/temporal-worker-controller
-
enhancement
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 65/100
temporalio/temporal-worker-controller#692 · 1 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
documentation good first issue help wanted
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
temporalio/temporal-worker-controller#691 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Feature Request] Configure temporal-worker-controller to use hostNetworkCó thể đã có người làm @josh-ferrell đã nhận 4 ngày trước. Đang mởhelm
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
temporalio/temporal-worker-controller#680 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Feature Request] Helm chart: support topologySpreadConstraints on the controller DeploymentCó thể đã có người làm @akolacz đã nhận 19 ngày trước. Đang mởhelm
temporalio/temporal-worker-controller#658 · 1 reaction · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
rbac
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
temporalio/temporal-worker-controller#654 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của temporalio/temporal-worker-controller
Issue tương tự
-
area: metrics area: tracing contribfest enhancement good first issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 83/100
open-telemetry/opentelemetry-ebpf-instrumentation#4188 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
blinklabs-io/dingo#6074 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
kind/bug remote
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
podman-container-tools/podman#30143 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
component/mesheryctl kind/bug language/go
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
meshery/meshery#22993 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100