@@ -365,6 +365,41 @@ deploy_pmm_server() {
365365 fi
366366}
367367
368+ deploy_pmm3_server () {
369+ helm uninstall -n " ${NAMESPACE} " pmm || :
370+ if [[ $OPENSHIFT ]]; then
371+ platform=openshift
372+ oc create sa pmm-server -n " $NAMESPACE "
373+ oc adm policy add-scc-to-user privileged -z pmm-server -n " $NAMESPACE "
374+
375+ if [[ $OPERATOR_NS ]]; then
376+ timeout 30 oc delete clusterrolebinding $( kubectl get clusterrolebinding | grep ' pmm-pg-operator-' | awk ' {print $1}' ) || :
377+ oc create clusterrolebinding pmm-pg-operator-cluster-wide --clusterrole=percona-postgresql-operator --serviceaccount=$NAMESPACE :pmm-server -n " $NAMESPACE "
378+ oc patch clusterrole/percona-postgresql-operator --type json -p=' [{"op":"add","path": "/rules/-","value":{"apiGroups":["security.openshift.io"],"resources":["securitycontextconstraints"],"verbs":["use"],"resourceNames":["privileged"]}}]' ${OPERATOR_NS: +-n $OPERATOR_NS }
379+ else
380+ oc create rolebinding pmm-pg-operator-namespace-only --role percona-postgresql-operator --serviceaccount=$NAMESPACE :pmm-server -n " ${NAMESPACE} "
381+ oc patch role/percona-postgresql-operator --type json -p=' [{"op":"add","path": "/rules/-","value":{"apiGroups":["security.openshift.io"],"resources":["securitycontextconstraints"],"verbs":["use"],"resourceNames":["privileged"]}}]' -n " $NAMESPACE "
382+ fi
383+ helm install monitoring --set imageTag=${IMAGE_PMM3_SERVER#*: } --set imageRepo=${IMAGE_PMM3_SERVER%:* } --set platform=$platform --set sa=pmm-server --set supresshttp2=false https://percona-charts.storage.googleapis.com/pmm-server-${PMM3_SERVER_VERSION} .tgz -n " $NAMESPACE "
384+ else
385+ platform=kubernetes
386+
387+ helm uninstall -n " ${NAMESPACE} " monitoring || :
388+ helm repo remove percona || :
389+ kubectl delete clusterrole monitoring --ignore-not-found
390+ kubectl delete clusterrolebinding monitoring --ignore-not-found
391+
392+ helm repo add percona https://percona.github.io/percona-helm-charts/
393+ helm install monitoring percona/pmm -n " ${NAMESPACE} " \
394+ --set fullnameOverride=monitoring \
395+ --set imageTag=3-dev-latest \
396+ --set imageRepo=perconalab/pmm-server \
397+ --set service.type=LoadBalancer \
398+ --set platform=" $platform " \
399+ --force
400+ fi
401+ }
402+
368403generate_pmm_api_key () {
369404 local ADMIN_PASSWORD=$( kubectl -n " ${NAMESPACE} " exec monitoring-0 -- bash -c " printenv | grep ADMIN_PASSWORD | cut -d '=' -f2" )
370405 local PMM_SERVICE_IP=$( get_service_ip monitoring-service)
@@ -378,17 +413,71 @@ generate_pmm_api_key() {
378413 | jq -r .key
379414}
380415
416+ generate_pmm3_server_token () {
417+ local key_name=$RANDOM
418+
419+ local ADMIN_PASSWORD
420+ ADMIN_PASSWORD=$( kubectl -n " ${NAMESPACE} " get secret pmm-secret -o jsonpath=" {.data.PMM_ADMIN_PASSWORD}" | base64 --decode)
421+
422+ if [[ -z $ADMIN_PASSWORD ]]; then
423+ echo " Error: ADMIN_PASSWORD is empty or not found!" >&2
424+ return 1
425+ fi
426+
427+ local create_response create_status_code create_json_response
428+ create_response=$( curl --insecure -s -X POST -H ' Content-Type: application/json' -H ' Accept: application/json' \
429+ -d " {\" name\" :\" ${key_name} \" , \" role\" :\" Admin\" , \" isDisabled\" :false}" \
430+ --user " admin:${ADMIN_PASSWORD} " \
431+ " https://$( get_service_ip monitoring-service) /graph/api/serviceaccounts" \
432+ -w " \n%{http_code}" )
433+
434+ create_status_code=$( echo " $create_response " | tail -n1)
435+ create_json_response=$( echo " $create_response " | sed ' $ d' )
436+
437+ if [[ $create_status_code -ne 201 ]]; then
438+ echo " Error: Failed to create PMM service account. HTTP Status: $create_status_code " >&2
439+ echo " Response: $create_json_response " >&2
440+ return 1
441+ fi
442+
443+ local service_account_id
444+ service_account_id=$( echo " $create_json_response " | jq -r ' .id' )
445+
446+ if [[ -z $service_account_id || $service_account_id == " null" ]]; then
447+ echo " Error: Failed to extract service account ID!" >&2
448+ return 1
449+ fi
450+
451+ local token_response token_status_code token_json_response
452+ token_response=$( curl --insecure -s -X POST -H ' Content-Type: application/json' \
453+ -d " {\" name\" :\" ${key_name} \" }" \
454+ --user " admin:${ADMIN_PASSWORD} " \
455+ " https://$( get_service_ip monitoring-service) /graph/api/serviceaccounts/${service_account_id} /tokens" \
456+ -w " \n%{http_code}" )
457+
458+ token_status_code=$( echo " $token_response " | tail -n1)
459+ token_json_response=$( echo " $token_response " | sed ' $ d' )
460+
461+ if [[ $token_status_code -ne 200 ]]; then
462+ echo " Error: Failed to create token. HTTP Status: $token_status_code " >&2
463+ echo " Response: $token_json_response " >&2
464+ return 1
465+ fi
466+
467+ echo " $token_json_response " | jq -r ' .key'
468+ }
469+
381470get_metric_values () {
382471 local metric=$1
383472 local instance=$2
384- local api_key =$3
473+ local token =$3
385474 local start=$( $date -u " +%s" -d " -5 minute" )
386475 local end=$( $date -u " +%s" )
387476 local endpoint=$( get_service_ip monitoring-service)
388477
389478 local wait_count=20
390479 local retry=0
391- until [[ $( curl -s -k -H " Authorization: Bearer ${api_key } " " https://$endpoint /graph/api/datasources/proxy/1/api/v1/query_range?query=min%28$metric %7Bnode_name%3D%7E%22$instance %22%7d%20or%20$metric %7Bnode_name%3D%7E%22$instance %22%7D%29&start=$start &end=$end &step=60" \
480+ until [[ $( curl -s -k -H " Authorization: Bearer ${token } " " https://$endpoint /graph/api/datasources/proxy/1/api/v1/query_range?query=min%28$metric %7Bnode_name%3D%7E%22$instance %22%7d%20or%20$metric %7Bnode_name%3D%7E%22$instance %22%7D%29&start=$start &end=$end &step=60" \
392481 | jq ' .data.result[0].values[][1]' \
393482 | grep ' ^"[0-9]' ) ]]; do
394483 sleep 2
438527 rm -f payload.json
439528}
440529
530+ get_qan20_values_pmm3 () {
531+ local instance=$1
532+ local token=$2
533+ local start=$( $date -u " +%Y-%m-%dT%H:%M:%S" -d " -30 minute" )
534+ local end=$( $date -u " +%Y-%m-%dT%H:%M:%S" )
535+ local endpoint=$( get_service_ip monitoring-service)
536+
537+ cat > payload.json << EOF
538+ {
539+ "columns":[
540+ "load",
541+ "num_queries",
542+ "query_time"
543+ ],
544+ "first_seen": false,
545+ "group_by": "queryid",
546+ "include_only_fields": [],
547+ "keyword": "",
548+ "labels": [
549+ {
550+ "key": "cluster",
551+ "value": ["postgresql"]
552+ }],
553+ "limit": 10,
554+ "offset": 0,
555+ "order_by": "-load",
556+ "main_metric": "load",
557+ "period_start_from": "$( $date -u -d ' -12 hour' ' +%Y-%m-%dT%H:%M:%S%:z' ) ",
558+ "period_start_to": "$( $date -u ' +%Y-%m-%dT%H:%M:%S%:z' ) "
559+ }
560+ EOF
561+
562+ curl -s -k -H " Authorization: Bearer ${token} " -XPOST -d @payload.json " https://$endpoint /v1/qan/metrics:getReport" \
563+ | jq ' .rows[].sparkline'
564+ rm -f payload.json
565+ }
566+
441567deploy_chaos_mesh () {
442568 destroy_chaos_mesh
443569
0 commit comments