@@ -365,6 +365,41 @@ deploy_pmm_server() {
365
365
fi
366
366
}
367
367
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
+
368
403
generate_pmm_api_key () {
369
404
local ADMIN_PASSWORD=$( kubectl -n " ${NAMESPACE} " exec monitoring-0 -- bash -c " printenv | grep ADMIN_PASSWORD | cut -d '=' -f2" )
370
405
local PMM_SERVICE_IP=$( get_service_ip monitoring-service)
@@ -378,17 +413,71 @@ generate_pmm_api_key() {
378
413
| jq -r .key
379
414
}
380
415
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
+
381
470
get_metric_values () {
382
471
local metric=$1
383
472
local instance=$2
384
- local api_key =$3
473
+ local token =$3
385
474
local start=$( $date -u " +%s" -d " -5 minute" )
386
475
local end=$( $date -u " +%s" )
387
476
local endpoint=$( get_service_ip monitoring-service)
388
477
389
478
local wait_count=20
390
479
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" \
392
481
| jq ' .data.result[0].values[][1]' \
393
482
| grep ' ^"[0-9]' ) ]]; do
394
483
sleep 2
438
527
rm -f payload.json
439
528
}
440
529
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
+
441
567
deploy_chaos_mesh () {
442
568
destroy_chaos_mesh
443
569
0 commit comments