This is an automated email from the ASF dual-hosted git repository.
wankai123 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-showcase.git
The following commit(s) were added to refs/heads/main by this push:
new 72560a1 Support Horizon UI (#261)
72560a1 is described below
commit 72560a1db887766b3705b20b31774bce2ea61ba0
Author: Wan Kai <[email protected]>
AuthorDate: Wed May 20 11:40:21 2026 +0800
Support Horizon UI (#261)
---
.github/workflows/publish-images.yaml | 4 +
Makefile.in | 10 +-
deploy/platform/kubernetes/Chart.yaml | 4 +-
deploy/platform/kubernetes/Makefile | 1 -
deploy/platform/kubernetes/templates/NOTES.txt | 4 +-
.../templates/swck-eventexporter-extras.yaml | 193 +++++++++++++++++++++
deploy/platform/kubernetes/values.yaml | 20 ++-
services/load-gen/Makefile | 9 +-
8 files changed, 226 insertions(+), 19 deletions(-)
diff --git a/.github/workflows/publish-images.yaml
b/.github/workflows/publish-images.yaml
index 4acbc0a..d55258c 100644
--- a/.github/workflows/publish-images.yaml
+++ b/.github/workflows/publish-images.yaml
@@ -36,6 +36,10 @@ jobs:
- uses: actions/checkout@v2
with:
submodules: true
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
with:
diff --git a/Makefile.in b/Makefile.in
index fd48b54..1dcc0c2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -33,10 +33,10 @@ ES_IMAGE ?=
docker.elastic.co/elasticsearch/elasticsearch-oss
ES_IMAGE_TAG ?= 7.10.2
SW_OAP_IMAGE ?= ghcr.io/apache/skywalking/oap
-SW_OAP_IMAGE_TAG ?= dc77df696afb5d97cca79ec123d0e93f7ae84939
+SW_OAP_IMAGE_TAG ?= 5b481a41a99861249410118e4cfbf591c4508dae
-SW_UI_IMAGE ?= ghcr.io/apache/skywalking/ui
-SW_UI_IMAGE_TAG ?= dc77df696afb5d97cca79ec123d0e93f7ae84939
+SW_UI_IMAGE ?= ghcr.io/apache/skywalking-horizon-ui
+SW_UI_IMAGE_TAG ?= 97950a600ceaece1d8056c4084d8551c1010d17d
SW_CLI_IMAGE ?=
ghcr.io/apache/skywalking-cli/skywalking-cli:bce7faaabbd57ed1f40156af8a8eb6c3eccea4ae
SW_EVENT_EXPORTER_IMAGE ?=
ghcr.io/apache/skywalking-kubernetes-event-exporter/skywalking-kubernetes-event-exporter:8a012a3f968cb139f817189afb9b3748841bba22
@@ -51,8 +51,8 @@ SW_SATELLITE_IMAGE_TAG ?=
v8778e3e8a4ab4962102502ffc9ba7a3c73270609
SW_ROVER_IMAGE ?=
ghcr.io/apache/skywalking-rover/skywalking-rover:67622c352b98fd32782a3e7afc7d3fbd6d6ec8e3
-SWCK_OPERATOR_IMAGE ?= docker.io/apache/skywalking-swck
-SWCK_OPERATOR_IMAGE_TAG ?= v0.9.0
+SWCK_OPERATOR_IMAGE ?= ghcr.io/apache/skywalking-swck/operator
+SWCK_OPERATOR_IMAGE_TAG ?= d299bc05ee230f5f366584054db5b099ca60166f
SW_GRAFANA_PLUGIN_VERSION ?= 0.1.0
GRAFANA_IMAGE ?= grafana/grafana:12.4.2
diff --git a/deploy/platform/kubernetes/Chart.yaml
b/deploy/platform/kubernetes/Chart.yaml
index 614080e..9b66083 100644
--- a/deploy/platform/kubernetes/Chart.yaml
+++ b/deploy/platform/kubernetes/Chart.yaml
@@ -24,13 +24,13 @@ sources:
dependencies:
- name: skywalking-helm
alias: skywalking
- version: 0.0.0-bacca5ae7da89f41ce31f4b446ce1309b4ccc985
+ version: 0.0.0-da0e267f877b9b8e5f7728ae4ea7dc7723a2a073
repository: oci://ghcr.io/apache/skywalking-helm
# @feature: java-agent-injector; the java agent injector is a component of
the swck operator, so we need to deploy the swck operator firstly
- name: skywalking-helm-swck-operator
alias: swck
- version: 0.0.0-158f116af32e8824ec897c0c6d3022136e7481bb
+ version: 0.0.0-da0e267f877b9b8e5f7728ae4ea7dc7723a2a073
repository: oci://ghcr.io/apache/skywalking-helm
condition: features.javaAgentInjector.enabled
diff --git a/deploy/platform/kubernetes/Makefile
b/deploy/platform/kubernetes/Makefile
index 18238e4..8772b63 100644
--- a/deploy/platform/kubernetes/Makefile
+++ b/deploy/platform/kubernetes/Makefile
@@ -44,7 +44,6 @@ HELM_OPTIONS := $(HELM_OPTIONS) --set-json
'skywalking.banyandb.storage.data.per
HELM_OPTIONS := $(HELM_OPTIONS) --set-json
'skywalking.banyandb.storage.data.persistentVolumeClaims[6]={"mountTargets":["stream","measure","property","trace"],"nodeRole":"cold","claimName":"cold-data","size":"500Gi","accessModes":["ReadWriteOnce"]$(PVC_STORAGE_CLASS_FIELD),"volumeMode":"Filesystem"}'
HELM_OPTIONS := $(HELM_OPTIONS) --set
skywalking.oap.image.repository=$(SW_OAP_IMAGE) --set
skywalking.oap.image.tag=$(SW_OAP_IMAGE_TAG)
HELM_OPTIONS := $(HELM_OPTIONS) --set
skywalking.ui.image.repository=$(SW_UI_IMAGE) --set
skywalking.ui.image.tag=$(SW_UI_IMAGE_TAG)
-HELM_OPTIONS := $(HELM_OPTIONS) --set
skywalking.ui.env.SW_ZIPKIN_ADDRESS=http://$(RELEASE)-oap.$(NAMESPACE).svc:9412
HELM_OPTIONS := $(HELM_OPTIONS) --set
skywalking.satellite.image.repository=$(SW_SATELLITE_IMAGE) --set
skywalking.satellite.image.tag=$(SW_SATELLITE_IMAGE_TAG)
HELM_OPTIONS := $(HELM_OPTIONS) --set
swck.image.repository=$(SWCK_OPERATOR_IMAGE) --set
swck.image.tag=$(SWCK_OPERATOR_IMAGE_TAG)
HELM_OPTIONS := $(HELM_OPTIONS) --set sampleServices.hub=$(HUB) --set
sampleServices.tag=$(TAG) --set
sampleServices.namespace=$(SAMPLE_SERVICES_NAMESPACE)
diff --git a/deploy/platform/kubernetes/templates/NOTES.txt
b/deploy/platform/kubernetes/templates/NOTES.txt
index 8b35be5..9aadcc8 100644
--- a/deploy/platform/kubernetes/templates/NOTES.txt
+++ b/deploy/platform/kubernetes/templates/NOTES.txt
@@ -40,8 +40,8 @@ Get the UI URL by running these commands:
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{
include "skywalking.ui.fullname" . }} -o
jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo http://$SERVICE_IP:{{ .Values.skywalking.ui.service.externalPort }}
{{- else if contains "ClusterIP" .Values.skywalking.ui.service.type }}
- echo "Visit http://127.0.0.1:8080 to use your application"
- kubectl port-forward svc/{{ printf "%s-ui" .Release.Name }} 8080:{{
.Values.skywalking.ui.service.externalPort }} --namespace {{ .Release.Namespace
}}
+ echo "Visit http://127.0.0.1:8081 to use your application"
+ kubectl port-forward svc/{{ printf "%s-ui" .Release.Name }} 8081:{{
.Values.skywalking.ui.service.externalPort }} --namespace {{ .Release.Namespace
}}
{{- end }}
{{- if .Values.skywalking.elasticsearch.enabled }}
diff --git
a/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml
b/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml
new file mode 100644
index 0000000..043f59d
--- /dev/null
+++ b/deploy/platform/kubernetes/templates/swck-eventexporter-extras.yaml
@@ -0,0 +1,193 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# Workaround for a gap in apache/skywalking-helm: the chart at the version
+# pinned in Chart.yaml does not ship the EventExporter CRD or RBAC, but the
+# pinned swck-operator image (Makefile.in: SWCK_OPERATOR_IMAGE_TAG) registers
+# an EventExporterReconciler unconditionally. Without these, the operator
+# fails cache sync and crashlooops, which takes its mutating webhook down
+# and blocks pod creation in sample-services.
+#
+# Remove this file once apache/skywalking-helm ships EventExporter natively.
+{{- if .Values.features.javaAgentInjector.enabled }}
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ controller-gen.kubebuilder.io/version: v0.19.0
+ name: eventexporters.operator.skywalking.apache.org
+spec:
+ group: operator.skywalking.apache.org
+ names:
+ kind: EventExporter
+ listKind: EventExporterList
+ plural: eventexporters
+ singular: eventexporter
+ scope: Namespaced
+ versions:
+ - additionalPrinterColumns:
+ - description: The version
+ jsonPath: .spec.version
+ name: Version
+ priority: 1
+ type: string
+ - jsonPath: .spec.image
+ name: Image
+ priority: 1
+ type: string
+ - description: The number of expected instances
+ jsonPath: .spec.instances
+ name: Instances
+ type: string
+ name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: EventExporter is the Schema for the eventexporters API
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation
of an object.
+ Servers should convert recognized schemas to the latest internal
value, and
+ may reject unrecognized values.
+ More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this
object represents.
+ Servers may infer this from the endpoint the client submits
requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: EventExporterSpec defines the desired state of
EventExporter
+ properties:
+ config:
+ description: Config of filters and exporters
+ type: string
+ image:
+ description: Image is the event exporter Docker image to
deploy.
+ type: string
+ replicas:
+ description: Replicas is the number of event exporter pods
+ format: int32
+ type: integer
+ version:
+ description: Version of EventExporter.
+ type: string
+ required:
+ - replicas
+ - version
+ type: object
+ status:
+ description: EventExporterStatus defines the observed state of
EventExporter
+ properties:
+ availableReplicas:
+ description: Total number of available pods targeted by this
deployment.
+ format: int32
+ type: integer
+ conditions:
+ description: Represents the latest available observations of
the underlying
+ deployment's current state.
+ items:
+ description: DeploymentCondition describes the state of a
deployment
+ at a certain point.
+ properties:
+ lastTransitionTime:
+ description: Last time the condition transitioned from
one status
+ to another.
+ format: date-time
+ type: string
+ lastUpdateTime:
+ description: The last time this condition was updated.
+ format: date-time
+ type: string
+ message:
+ description: A human readable message indicating details
about
+ the transition.
+ type: string
+ reason:
+ description: The reason for the condition's last
transition.
+ type: string
+ status:
+ description: Status of the condition, one of True,
False, Unknown.
+ type: string
+ type:
+ description: Type of deployment condition.
+ type: string
+ required:
+ - status
+ - type
+ type: object
+ type: array
+ configMapName:
+ description: Name of the configMap.
+ type: string
+ type: object
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras
+rules:
+- apiGroups:
+ - operator.skywalking.apache.org
+ resources:
+ - eventexporters
+ verbs:
+ - create
+ - delete
+ - get
+ - list
+ - patch
+ - update
+ - watch
+- apiGroups:
+ - operator.skywalking.apache.org
+ resources:
+ - eventexporters/finalizers
+ verbs:
+ - update
+- apiGroups:
+ - operator.skywalking.apache.org
+ resources:
+ - eventexporters/status
+ verbs:
+ - get
+ - patch
+ - update
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: {{ .Values.swck.fullnameOverride }}-eventexporter-extras
+subjects:
+- kind: ServiceAccount
+ name: {{ .Values.swck.fullnameOverride }}-controller-manager
+ namespace: {{ .Release.Namespace }}
+{{- end }}
\ No newline at end of file
diff --git a/deploy/platform/kubernetes/values.yaml
b/deploy/platform/kubernetes/values.yaml
index 1ad0e25..b2e5f56 100644
--- a/deploy/platform/kubernetes/values.yaml
+++ b/deploy/platform/kubernetes/values.yaml
@@ -34,9 +34,6 @@ skywalking:
zipkin-query: 9412
metrics: 1234
env:
- SW_ADMIN_SERVER: default
- SW_DSL_DEBUGGING: default
- SW_RECEIVER_RUNTIME_RULE: default
SW_HEALTH_CHECKER: default
SW_OTEL_RECEIVER: default # @feature: so11y;,mysql;kubernetes-monitor
enable OpenTelemetry receiver to receive OpenTelemetry metrics
# @feature: vm; enable vm rules to analyze VM metrics
@@ -157,8 +154,21 @@ skywalking:
repository: ~
tag: ~
pullPolicy: IfNotPresent
- env:
- SW_ZIPKIN_ADDRESS: ""
+ # Minimal default so `make deploy.kubernetes` works for local dev — the
+ # upstream Horizon UI BFF refuses to start without at least one user.
+ # The hosted demo environment overrides this via demo-env-installer's
+ # demo-values.yaml; rotate before exposing outside trusted networks.
+ config:
+ auth:
+ backend: local
+ local:
+ users:
+ - username: admin # password: admin
+ passwordHash:
"$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM"
+ roles: [admin]
+ - username: skywalking # password: skywalking
+ passwordHash:
"$argon2id$v=19$m=65536,t=3,p=4$Zqj8HhQDqm8d5c2MipHYZw$BsaCnu4bdd4uadIldx3wwYLsdo47Thxb7Lv1MXpWG2Q"
+ roles: [ viewer, maintainer ]
banyandb:
enabled: false
image:
diff --git a/services/load-gen/Makefile b/services/load-gen/Makefile
index 03eab0f..0128e8e 100644
--- a/services/load-gen/Makefile
+++ b/services/load-gen/Makefile
@@ -23,12 +23,13 @@ build:
.PHONY: docker docker.build docker.push
+# Multi-arch because chromium-base aborts under x86_64 QEMU on ARM hosts (SSE3
check vs /proc/cpuinfo).
+LOAD_GEN_PLATFORMS ?= linux/amd64,linux/arm64
+
docker: docker.build
docker.build:
docker build . -t $(HUB)/load-gen:$(TAG) -t
$(HUB)/load-gen:$(TAG)-agentless
-docker.push: docker.build
- docker push $(HUB)/load-gen:$(TAG)
- docker tag $(HUB)/load-gen:$(TAG) $(HUB)/load-gen:$(TAG)-agentless
- docker push $(HUB)/load-gen:$(TAG)-agentless
+docker.push:
+ docker buildx build --platform $(LOAD_GEN_PLATFORMS) --push . -t
$(HUB)/load-gen:$(TAG) -t $(HUB)/load-gen:$(TAG)-agentless