feat: add metrics chart and update freeleaps-service-hub Jenkinsfile

This commit is contained in:
icecheng 2025-09-18 13:46:24 +08:00
parent c48d515ab4
commit bb1da229fb
10 changed files with 454 additions and 1 deletions

View File

@ -4,7 +4,7 @@ executeFreeleapsPipeline {
serviceName = 'freeleaps' serviceName = 'freeleaps'
environmentSlug = 'alpha' environmentSlug = 'alpha'
// Ensure this branch exists in the freeleaps-service-hub repository // 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" serviceGitRepo = "https://gitea.freeleaps.mathmast.com/freeleaps/freeleaps-service-hub.git"
serviceGitRepoType = 'monorepo' serviceGitRepoType = 'monorepo'
serviceGitCredentialsId = 'freeleaps-ops-git-credentials' serviceGitCredentialsId = 'freeleaps-ops-git-credentials'
@ -136,6 +136,27 @@ executeFreeleapsPipeline {
imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'],
registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', registryCredentialsId: 'freeleaps-devops-docker-hub-credentials',
semanticReleaseEnabled: true 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
] ]
] ]
} }

View File

@ -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"

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -135,6 +135,27 @@ executeFreeleapsPipeline {
imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'], imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'],
registryCredentialsId: 'freeleaps-devops-docker-hub-credentials', registryCredentialsId: 'freeleaps-devops-docker-hub-credentials',
semanticReleaseEnabled: true 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
] ]
] ]
} }