From bb1da229fb5e0baa4242f0f7a85d714b7dc25798 Mon Sep 17 00:00:00 2001 From: icecheng Date: Thu, 18 Sep 2025 13:46:24 +0800 Subject: [PATCH] feat: add metrics chart and update freeleaps-service-hub Jenkinsfile --- .../ci/freeleaps-service-hub/Jenkinsfile | 23 ++++- freeleaps/helm-pkg/metrics/Chart.yaml | 6 ++ .../metrics/templates/metrics/deployment.yaml | 97 +++++++++++++++++++ .../templates/metrics/metrics-config.yaml | 13 +++ .../metrics/templates/metrics/service.yaml | 26 +++++ .../metrics/templates/metrics/vpa.yaml | 32 ++++++ freeleaps/helm-pkg/metrics/values.alpha.yaml | 71 ++++++++++++++ freeleaps/helm-pkg/metrics/values.prod.yaml | 95 ++++++++++++++++++ freeleaps/helm-pkg/metrics/values.yaml | 71 ++++++++++++++ .../prod/ci/freeleaps-service-hub/Jenkinsfile | 21 ++++ 10 files changed, 454 insertions(+), 1 deletion(-) create mode 100644 freeleaps/helm-pkg/metrics/Chart.yaml create mode 100644 freeleaps/helm-pkg/metrics/templates/metrics/deployment.yaml create mode 100644 freeleaps/helm-pkg/metrics/templates/metrics/metrics-config.yaml create mode 100644 freeleaps/helm-pkg/metrics/templates/metrics/service.yaml create mode 100644 freeleaps/helm-pkg/metrics/templates/metrics/vpa.yaml create mode 100644 freeleaps/helm-pkg/metrics/values.alpha.yaml create mode 100644 freeleaps/helm-pkg/metrics/values.prod.yaml create mode 100644 freeleaps/helm-pkg/metrics/values.yaml diff --git a/freeleaps/alpha/ci/freeleaps-service-hub/Jenkinsfile b/freeleaps/alpha/ci/freeleaps-service-hub/Jenkinsfile index 5b0fef1c..9a866d0e 100644 --- a/freeleaps/alpha/ci/freeleaps-service-hub/Jenkinsfile +++ b/freeleaps/alpha/ci/freeleaps-service-hub/Jenkinsfile @@ -4,7 +4,7 @@ executeFreeleapsPipeline { serviceName = 'freeleaps' environmentSlug = 'alpha' // Ensure this branch exists in the freeleaps-service-hub repository - serviceGitBranch = 'dev' + serviceGitBranch = 'freeleaps/icecheng/metrics' serviceGitRepo = "https://gitea.freeleaps.mathmast.com/freeleaps/freeleaps-service-hub.git" serviceGitRepoType = 'monorepo' serviceGitCredentialsId = 'freeleaps-ops-git-credentials' @@ -136,6 +136,27 @@ executeFreeleapsPipeline { imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', semanticReleaseEnabled: true + ], + [ + name: 'metrics', + root: 'apps/metrcis', + language: 'python', + dependenciesManager: 'pip', + requirementsFile: 'requirements.txt', + buildCacheEnabled: true, + buildAgentImage: 'python:3.12-slim', + buildArtifacts: ['.'], + lintEnabled: false, + sastEnabled: false, + imageRegistry: 'docker.io', + imageRepository: 'freeleaps', + imageName: 'devops', + imageBuilder: 'dind', + dockerfilePath: 'Dockerfile', + imageBuildRoot: '.', + imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], + registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', + semanticReleaseEnabled: true ] ] } \ No newline at end of file diff --git a/freeleaps/helm-pkg/metrics/Chart.yaml b/freeleaps/helm-pkg/metrics/Chart.yaml new file mode 100644 index 00000000..3c66e7ce --- /dev/null +++ b/freeleaps/helm-pkg/metrics/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: metrics +description: A Helm Chart of metrics, which part of Freeleaps Platform, powered by Freeleaps. +type: application +version: 0.0.1 +appVersion: "0.0.1" diff --git a/freeleaps/helm-pkg/metrics/templates/metrics/deployment.yaml b/freeleaps/helm-pkg/metrics/templates/metrics/deployment.yaml new file mode 100644 index 00000000..e81c2178 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/templates/metrics/deployment.yaml @@ -0,0 +1,97 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + app.kubernetes.io/name: "metrics" + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + name: "metrics" + namespace: {{ .Release.Namespace | quote }} +spec: + selector: + matchLabels: + app.kubernetes.io/name: "metrics" + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + replicas: {{ .Values.metrics.replicas }} + template: + metadata: + labels: + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} + app.kubernetes.io/name: "metrics" + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + annotations: + app.kubernetes.io/config-checksum: {{ include (print $.Template.BasePath "/metrics/metrics-config.yaml") . | sha256sum }} + spec: + containers: + - name: "metrics" + image: "{{ coalesce .Values.metrics.image.registry .Values.global.registry "docker.io"}}/{{ coalesce .Values.metrics.image.repository .Values.global.repository }}/{{ .Values.metrics.image.name }}:{{ .Values.metrics.image.tag | default "latest" }}" + imagePullPolicy: {{ .Values.metrics.image.imagePullPolicy | default "IfNotPresent" }} + ports: + {{- range $port := .Values.metrics.ports }} + - containerPort: {{ $port.containerPort }} + name: {{ $port.name }} + protocol: {{ $port.protocol }} + {{- end }} + {{- if .Values.metrics.resources }} + resources: + {{- toYaml .Values.metrics.resources | nindent 12 }} + {{- end }} + {{- if .Values.metrics.probes }} + {{- if and (.Values.metrics.probes.liveness) (eq .Values.metrics.probes.liveness.type "httpGet") }} + livenessProbe: + httpGet: + path: {{ .Values.metrics.probes.liveness.config.path }} + port: {{ .Values.metrics.probes.liveness.config.port }} + {{- if .Values.metrics.probes.liveness.config.initialDelaySeconds }} + initialDelaySeconds: {{ .Values.metrics.probes.liveness.config.initialDelaySeconds }} + {{- end }} + {{- if .Values.metrics.probes.liveness.config.periodSeconds }} + periodSeconds: {{ .Values.metrics.probes.liveness.config.periodSeconds }} + {{- end }} + {{- if .Values.metrics.probes.liveness.config.timeoutSeconds }} + timeoutSeconds: {{ .Values.metrics.probes.liveness.config.timeoutSeconds }} + {{- end }} + {{- if .Values.metrics.probes.liveness.config.successThreshold }} + successThreshold: {{ .Values.metrics.probes.liveness.config.successThreshold }} + {{- end }} + {{- if .Values.metrics.probes.liveness.config.failureThreshold }} + failureThreshold: {{ .Values.metrics.probes.liveness.config.failureThreshold }} + {{- end }} + {{- if .Values.metrics.probes.liveness.config.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.metrics.probes.liveness.config.terminationGracePeriodSeconds }} + {{- end }} + {{- end }} + {{- if and (.Values.metrics.probes.readiness) (eq .Values.metrics.probes.readiness.type "httpGet") }} + readinessProbe: + httpGet: + path: {{ .Values.metrics.probes.readiness.config.path }} + port: {{ .Values.metrics.probes.readiness.config.port }} + {{- if .Values.metrics.probes.readiness.config.initialDelaySeconds }} + initialDelaySeconds: {{ .Values.metrics.probes.readiness.config.initialDelaySeconds }} + {{- end }} + {{- if .Values.metrics.probes.readiness.config.periodSeconds }} + periodSeconds: {{ .Values.metrics.probes.readiness.config.periodSeconds }} + {{- end }} + {{- if .Values.metrics.probes.readiness.config.timeoutSeconds }} + timeoutSeconds: {{ .Values.metrics.probes.readiness.config.timeoutSeconds }} + {{- end }} + {{- if .Values.metrics.probes.readiness.config.successThreshold }} + successThreshold: {{ .Values.metrics.probes.readiness.config.successThreshold }} + {{- end }} + {{- if .Values.metrics.probes.readiness.config.failureThreshold }} + failureThreshold: {{ .Values.metrics.probes.readiness.config.failureThreshold }} + {{- end }} + {{- end }} + {{- end}} + env: + {{- range $key, $value := .Values.metrics.configs }} + - name: {{ $key | snakecase | upper }} + valueFrom: + secretKeyRef: + name: metrics-config + key: {{ $key | snakecase | upper }} + {{- end }} \ No newline at end of file diff --git a/freeleaps/helm-pkg/metrics/templates/metrics/metrics-config.yaml b/freeleaps/helm-pkg/metrics/templates/metrics/metrics-config.yaml new file mode 100644 index 00000000..dd43d201 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/templates/metrics/metrics-config.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Secret +metadata: + name: metrics-config + namespace: {{ .Release.Namespace }} +type: Opaque +data: + STARROCKS_HOST: {{ .Values.metrics.configs.starrocksHost | b64enc | quote }} + STARROCKS_PORT: {{ .Values.metrics.configs.starrocksPort | toString | b64enc | quote }} + STARROCKS_USER: {{ .Values.metrics.configs.starrocksUser | b64enc | quote }} + STARROCKS_PASSWORD: {{ .Values.metrics.configs.starrocksPassword | b64enc | quote }} + STARROCKS_DATABASE: {{ .Values.metrics.configs.starrocksDatabase | b64enc | quote }} + PROMETHEUS_ENDPOINT: {{ .Values.metrics.configs.prometheusEndpoint | b64enc | quote }} \ No newline at end of file diff --git a/freeleaps/helm-pkg/metrics/templates/metrics/service.yaml b/freeleaps/helm-pkg/metrics/templates/metrics/service.yaml new file mode 100644 index 00000000..50b615eb --- /dev/null +++ b/freeleaps/helm-pkg/metrics/templates/metrics/service.yaml @@ -0,0 +1,26 @@ +{{ $namespace := .Release.Namespace }} +{{ $appVersion := .Chart.AppVersion | quote }} +{{ $releaseService := .Release.Service }} +{{ $releaseName := .Release.Name }} +{{- range $service := .Values.metrics.services }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $service.name }} + namespace: {{ $namespace }} + labels: + app.kubernetes.io/version: {{ $appVersion }} + app.kubernetes.io/name: {{ $service.name | quote }} + app.kubernetes.io/managed-by: {{ $releaseService }} + app.kubernetes.io/instance: {{ $releaseName }} +spec: + ports: + - port: {{ $service.port }} + targetPort: {{ $service.targetPort }} + selector: + app.kubernetes.io/version: {{ $appVersion }} + app.kubernetes.io/name: "metrics" + app.kubernetes.io/managed-by: {{ $releaseService }} + app.kubernetes.io/instance: {{ $releaseName }} +{{- end }} \ No newline at end of file diff --git a/freeleaps/helm-pkg/metrics/templates/metrics/vpa.yaml b/freeleaps/helm-pkg/metrics/templates/metrics/vpa.yaml new file mode 100644 index 00000000..bc3efdc3 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/templates/metrics/vpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.metrics.vpa }} +--- +apiVersion: autoscaling.k8s.io/v1 +kind: VerticalPodAutoscaler +metadata: + name: {{ .Release.Name }}-vpa + namespace: {{ .Release.Namespace }} +spec: + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: metrics + resourcePolicy: + containerPolicies: + - containerName: '*' + {{- if .Values.metrics.vpa.minAllowed.enabled }} + minAllowed: + cpu: {{ .Values.metrics.vpa.minAllowed.cpu }} + memory: {{ .Values.metrics.vpa.minAllowed.memory }} + {{- end }} + {{- if .Values.metrics.vpa.maxAllowed.enabled }} + maxAllowed: + cpu: {{ .Values.metrics.vpa.maxAllowed.cpu }} + memory: {{ .Values.metrics.vpa.maxAllowed.memory }} + {{- end }} + {{- if .Values.metrics.vpa.controlledResources }} + controlledResources: + {{- range .Values.metrics.vpa.controlledResources }} + - {{ . }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/freeleaps/helm-pkg/metrics/values.alpha.yaml b/freeleaps/helm-pkg/metrics/values.alpha.yaml new file mode 100644 index 00000000..35a2bb76 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/values.alpha.yaml @@ -0,0 +1,71 @@ +global: + registry: docker.io + repository: freeleaps + nodeSelector: {} +logIngest: + enabled: false +metrics: + replicas: 1 + image: + registry: docker.io + repository: null + name: metrics + tag: "1.0.0" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8009 + protocol: TCP + resources: + requests: + cpu: '0.1' + memory: 64Mi + limits: + cpu: '0.2' + memory: 128Mi + probes: + liveness: + type: httpGet + config: + path: /api/_/livez + port: 8009 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 5 + terminationGracePeriodSeconds: 30 + readiness: + type: httpGet + config: + path: /api/_/readyz + port: 8009 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 5 + services: + - name: metrics-service + type: ClusterIP + port: 8009 + targetPort: 8009 + configs: + starrocksHost: UTC + starrocksPort: 8009 + starrocksUser: user + starrocksPassword: password + starrocksDatabase: metrics + prometheusEndpoint: http://prometheus-gateway.freeleaps-monitoring-system:9090 + vpa: + minAllowed: + enabled: false + cpu: 100m + memory: 64Mi + maxAllowed: + enabled: true + cpu: 100m + memory: 128Mi + controlledResources: + - cpu + - memory diff --git a/freeleaps/helm-pkg/metrics/values.prod.yaml b/freeleaps/helm-pkg/metrics/values.prod.yaml new file mode 100644 index 00000000..9c918915 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/values.prod.yaml @@ -0,0 +1,95 @@ +global: + registry: docker.io + repository: freeleaps + nodeSelector: {} +logIngest: + enabled: false +devops: + replicas: 1 + image: + registry: docker.io + repository: null + name: devops + tag: snapshot-046f9ff + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8014 + protocol: TCP + resources: + requests: + cpu: '0.1' + memory: 64Mi + limits: + cpu: '0.2' + memory: 128Mi + probes: {} + services: + - name: devops-service + type: ClusterIP + port: 8014 + targetPort: 8014 + serviceMonitor: + enabled: false + labels: + release: kube-prometheus-stack + namespace: freeleaps-monitoring-system + interval: 30s + scrapeTimeout: '' + ingresses: {} + configs: + tz: UTC + appName: devops + jwtSecretKey: '' + jwtAlgorithm: HS256 + accessTokenExpireMinutes: '3600' + refreshTokenExpireDays: '1' + appMongodbName: freeleaps2 + appMongodbPort: '27017' + metricsEnabled: 'false' + probesEnabled: 'true' + baseGiteaUrl: https://gitea.freeleaps.mathmast.com + baseReconcileUrl: http://freeleaps-prod-devops-reconciler-freeleaps-devops-reconciler.freeleaps-prod.svc.freeleaps.cluster:5000 + baseLokiUrl: http://loki-gateway.freeleaps-logging-system + logBasePath: /app/log/devops + logRetention: 30 days + logRotation: 00:00 + logBackupFiles: '5' + logRotationBytes: '10485760' + mockMode: 'false' + mockResponseDelay: '1000' + rabbitmqHost: freeleaps-prod-rabbitmq-headless.freeleaps-prod.svc.freeleaps.cluster + rabbitmqPort: 5672 + rabbitmqUsername: user + rabbitmqVirtualHost: / + rabbitmqOutputQueueName: freeleaps.devops.reconciler.output + rabbitmqInputQueueName: freeleaps.devops.reconciler.input + secrets: + secretStoreRef: + kind: FreeleapsSecretStore + name: freeleaps-main-secret-store + target: + name: freeleaps-devops-prod-secrets + creationPolicy: Owner + refreshInterval: 30s + data: + - key: appMongodbUri + remoteRef: + key: freeleaps-prod-mongodb-uri + type: Secret + - key: rabbitmqPassword + remoteRef: + key: freeleaps-prod-rabbitmq-password + type: Secret + vpa: + minAllowed: + enabled: false + cpu: 100m + memory: 64Mi + maxAllowed: + enabled: true + cpu: 100m + memory: 128Mi + controlledResources: + - cpu + - memory diff --git a/freeleaps/helm-pkg/metrics/values.yaml b/freeleaps/helm-pkg/metrics/values.yaml new file mode 100644 index 00000000..c00438b8 --- /dev/null +++ b/freeleaps/helm-pkg/metrics/values.yaml @@ -0,0 +1,71 @@ +global: + registry: docker.io + repository: freeleaps + nodeSelector: {} +logIngest: + enabled: false +metrics: + replicas: 1 + image: + registry: docker.io + repository: null + name: metrics + tag: "1.0.0" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8009 + protocol: TCP + resources: + requests: + cpu: '0.1' + memory: 64Mi + limits: + cpu: '0.2' + memory: 128Mi + probes: + liveness: + type: httpGet + config: + path: /api/_/livez + port: 8009 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 5 + terminationGracePeriodSeconds: 30 + readiness: + type: httpGet + config: + path: /api/_/readyz + port: 8009 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 5 + services: + - name: metrics-service + type: ClusterIP + port: 8009 + targetPort: 8009 + configs: + starrocksHost: "" + starrocksPort: 8009 + starrocksUser: "" + starrocksPassword: "" + starrocksDatabase: "" + prometheusEndpoint: "" + vpa: + minAllowed: + enabled: false + cpu: 100m + memory: 64Mi + maxAllowed: + enabled: true + cpu: 100m + memory: 128Mi + controlledResources: + - cpu + - memory diff --git a/freeleaps/prod/ci/freeleaps-service-hub/Jenkinsfile b/freeleaps/prod/ci/freeleaps-service-hub/Jenkinsfile index 8c2d5678..a5f8ec5c 100644 --- a/freeleaps/prod/ci/freeleaps-service-hub/Jenkinsfile +++ b/freeleaps/prod/ci/freeleaps-service-hub/Jenkinsfile @@ -135,6 +135,27 @@ executeFreeleapsPipeline { imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', semanticReleaseEnabled: true + ], + [ + name: 'metrics', + root: 'apps/metrcis', + language: 'python', + dependenciesManager: 'pip', + requirementsFile: 'requirements.txt', + buildCacheEnabled: true, + buildAgentImage: 'python:3.12-slim', + buildArtifacts: ['.'], + lintEnabled: false, + sastEnabled: false, + imageRegistry: 'docker.io', + imageRepository: 'freeleaps', + imageName: 'devops', + imageBuilder: 'dind', + dockerfilePath: 'Dockerfile', + imageBuildRoot: '.', + imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], + registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', + semanticReleaseEnabled: true ] ] } \ No newline at end of file